View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

その他のビデオ

  • 概要
  • トランスクリプト
  • コード
  • 作文ツールの詳細

    作文ツールを使用すると、アプリ内で直接テキストを校正したり、書き直したり、変換したりできます。アプリに合わせて作文ツールをカスタマイズするための高度なテクニックを学びましょう。いくつかのフォーマットオプションを紹介し、リッチテキストの編集でそれらがどのように機能するかについて説明します。カスタムテキストエンジンを使用している場合は、作文ツール体験全体をシームレスに統合し、テキストビューから直接編集できるようにする方法を説明します。

    関連する章

    • 0:00 - イントロダクション
    • 0:46 - 新機能
    • 2:21 - ネイティブテキストビューのカスタマイズ
    • 4:00 - リッチテキストのフォーマッティング
    • 7:41 - カスタムテキストエンジン
    • 16:58 - 次のステップ

    リソース

    • Enhancing your custom text engine with Writing Tools
    • Writing Tools
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC24

    • Writing Toolsの導入
  • このビデオを検索

    「Dive Deeper into Writing Tools」へ ようこそ Dong Yuanです テキスト入力と国際化を 担当しています 去年は 作文ツールの概要と アプリへの統合方法を紹介しました このセッションでは より高度なトピックについて解説します まずは 作文ツールの新機能です 次に ネイティブテキストビューでの 作文ツールの使用体験のカスタマイズ方法

    リッチテキストのシームレスな処理方法と

    カスタムのテキストエンジンを使う場合に 作文ツールの全機能を 統合する方法などを紹介します さっそく始めましょう 作文ツールを使うと 文章の書き直し、校正、要約を テキストビュー内で直接実行できます 今年 作文ツールには 多くの新機能が追加されました ChatGPTの統合により 書きたいテーマのコンテンツを 生成できるほか 簡単なプロンプトで画像も作成できます

    visionOSでも利用可能になりました メールやメモでも 独自のアプリでも ほぼあらゆる場所で機能します

    iOS、iPadOS、macOS 26の 新機能として 書き直しによる変更を記述した後 フォローアップリクエストを入力できます

    例えば 温かみのある文体、 会話調、元気づける調子などへの 変更を指示できます

    また 作文ツールを ショートカットからも実行でき Apple intelligenceを使って ワークフローをレベルアップできます 校正、書き直し、要約などのツールを 自動化して使用できるようになります

    作文ツールをアプリでサポートするための 各種APIも追加されました 起動用のツールバーボタンや 標準メニュー項目を使用できるほか リッチテキストのプレゼンテーション インテントを返すよう指示したり カスタムテキストエンジンに 強力なコーディネータを統合したりできます 結果オプションとコーディネータの APIについては 後で詳しく説明します

    次は システムが提供する 作文ツールのネイティブテキストビューを カスタマイズする方法を説明します

    基本事項については 昨年のビデオで解説しています ネイティブテキストビューについては 作文ツールのサポートが無償提供されます ライフサイクルメソッドを利用して 同期の一時停止などの操作に 応答できます テキストビューをカスタマイズして 作文ツールの動作の一部/すべてを使えます 書き直しを適用しない範囲も指定できます また 結果オプションでリッチテキスト、 リスト、表のサポートを管理できます なお昨年のセッションの時は 結果オプションは AllowedInputOptionsという 名前でしたが 意味が明確になるよう WritingToolsResultOptionsに 変更されました

    作文ツールは テキスト選択時に使用できますが メモアプリやメールアプリなど テキストの多いアプリでは ツールバーボタンの追加を検討しましょう

    UIKitではUIBarButtonItem AppKitではNSToolbarItemを使用します

    コンテキストメニューには 作文ツールの項目が自動的に挿入されます カスタムメニューを実装済みの場合や 作文ツールの項目を移動したい場合は automaticallyInsertsWritingToolsItemsを falseに設定し writingToolsItemsAPIで 標準項目を取得します 今年は メニューの校正、書き直し、 要約の各オプションを更新しました APIを使用することで 更新をすべて無料で入手できます

    次はフォーマットについての説明です

    アプリには様々なテキストビューがあり Finderの検索フィールドなど 一部の ビューはリッチテキストをサポートしません TextEditなどの テキストビューではサポートされます

    メモアプリなどのビューでは セマンティクススタイルをサポートし 見出しや小見出し ブロック引用など 様々なセマンティックスタイルを 段落に指定できます 例えばメモアプリでは 作文ツールの結果表示に ネイティブのメモ、見出し、 表、リストを利用できます テキストビューがサポートする テキストの種類は WritingToolsResultOptionsで指定します プレーンテキストビューの場合は plainTextの結果オプションを使用します 従来通り 作文ツールは テキストビューとの通信に NSAttributedStringを使用しますが 内部の属性はすべて無視して問題ありません TextEditなどでのリッチテキストには richTextの結果オプションを使用します テキストフィールドで リストや表がサポートされるかに応じて listかtableのオプションを使用できます また 作文ツールでは属性文字列に 太字や斜体などの表示属性を追加できます

    メモなど セマンティクス形式に対する 特別なサポートが可能なアプリでは richTextオプションとともに 新しい presentationIntentオプションを使えます 作文ツールはNSAttributedStringと プレゼンテーションインテントを 使用して テキストビューと通信します

    表示属性と プレゼンテーションインテントの違いは 何でしょうか

    TextEditの例では 作文ツールは 太字や斜体などの表示属性を使用して リッチテキストを作成し 属性文字列をテキストビューに送信します これらの属性は フォントの具体的な サイズなどのスタイル情報のみを提供し セマンティックスタイル情報を含みません 一方 メモアプリは見出しなどの セマンティクススタイルをフルに活用します 作文ツールは先ほどと同じテキストを 下に生成しましたが ここでは代わりに 属性文字列に プレゼンテーションインテントを追加します するとメモは そのインテントを内部の セマンティックスタイルに変換できます この例では 見出しの部分は 具体的なフォント属性のない 見出しインテントです

    なお プレゼンテーションインテントが 結果オプションで指定されていても 作文ツールは 属性文字列に表示属性を追加できます 一部のスタイルはプレゼンテーション インテントで表現できるからです この例では 作文ツールは 強調のプレゼンテーションインテントと 取り消し線の表示属性の両方を使って 「crucial and deleted」のテキストを 表示しています

    まとめると プレゼンテーションインテントのモードでは スタイルの指定に可能な限り プレゼンテーションインテントを使います リスト、表、コードブロックなどの 要素を指定できます

    表示属性も使用できますが その対象は 下線や上付き/下付き文字などです 最後に プレゼンテーションインテントには デフォルトのスタイルがありません アプリにおいて プレゼンテーションインテントを 表示属性や独自の内部スタイルに 変換する必要があります

    作文ツールに テキストのセマンティクスを よりよく理解させるために presentationIntentオプションを 導入したら テキストビューの requestsContextsメソッドを上書きし プレゼンテーションインテントを含む コンテキストを 可能な限り提供します

    最後に 完全にカスタムのテキストエンジンを 使用する場合にも対応できます

    お使いのテキストエンジンが 次に挙げる一般的な 文字編集プロトコルを採用している場合 作文ツールの基本的な機能は無料です 対象のプロトコルは iOSでは UITextInteractionまたは UITextSelectionDisplayInteractionと UIEditMenuInteractionです macOSでは NSServicesMenuRequestorを ビューで採用する必要があります これにより テキストビューで作文ツールを使用し サービスメニューで機能を サポートできるようになります 基本的な導入方法については WWDC24のセッションをご覧ください

    より高度な手順を実施して 作文ツールのフル機能を 利用することもできます この方法では インプレースでのテキストの 書き直し、アニメーションの表示、 校正による変更のインライン表示などが 可能になります WritingToolsCoordinator APIは カスタムテキストエンジン用の新機能です

    このAPIは ビューと作文ツールとの インタラクションを管理します

    ビューにコーディネータをアタッチし 作文ツールコーディネータの デリゲートメソッドを実装するための デリゲートを作成します デリゲートは作文ツールの処理に対する コンテキストの提供、 変更の統合、 アニメーションで使用する プレビューオブジェクトの提供、 作文ツールが校正マークを描画するための 座標の提供、 状態の変化への応答などを実行します これらの機能の使用方法を 簡単なデモで見てみましょう

    これは TextKit 2で構築した カスタムテキストエンジンです ご覧の通り NSTextInputClientや NSServicesMenuRequestorなどの 一般的なテキスト編集プロトコルを 実装済みです

    アプリをビルドし実行すると 作文ツールの 基本機能が無料でサポートされます 結果はすべてパネルに表示されます 書き直しを行ったり

    結果による置換やコピーを行ったりできます

    では 作文ツールの機能の フルサポートを実装しましょう

    DocumentViewで 作文ツールのセッション中に必要になる インスタンスプロパティを追加します NSWritingToolsCoordinatorオブジェクトを 初期化し

    デリゲートをselfに設定して

    NSViewに割り当てます initでconfigureWritingToolsを 呼び出すことも必要です

    当然ながら DocumentViewが NSWritingToolsCoordinator.Delegateに 準拠していないというエラーが出ます

    DocumentViewのExtentionに すべてのデリゲートメソッドを実装する ファイルをドラッグします これにより コンテキストの提供、

    テキストの置換と選択、 校正用のバウンディングボックスの表示、

    アニメーションのプレビューの生成などが 行われるようになります

    アプリをビルドして実行しましょう

    テキストの書き直しを行うと

    アニメーションが表示され 変更内容をテキストビューで 直接確認できます

    校正を行うと 作文ツールによって下線が追加されます

    個々の提案をクリックして 変更内容を確認することもできます

    次に これらの各手順について 詳しく説明します

    最初に コーディネータを作成し ビューにアタッチします WritingToolsCoordinatorは UIKitのUIインタラクションであり 他のUIインタラクションと同様に UIViewにアタッチします AppKitでは これはNSViewの インスタンスプロパティです コーディネータを準備できたら 作文ツールの動作と結果オプションについて 任意のものを設定できます

    次はデリゲートメソッドです まず 作文ツールには 現在のテキストのコンテキストが必要です コンテキストは NSAttributedStringとして 扱われる一連のテキストと 選択箇所で構成されます attributedStringには 少なくとも 現在のテキストの選択箇所を 含める必要があります 選択箇所の前後の段落を 含めることもできます これにより 作文ツールが対象テキストの 前後の文脈をより理解できるようになります context.attributedStringに基づいて 範囲を現在の選択箇所として設定します 何も選択しない場合 ドキュメント全体をコンテキストとして返し 範囲をカーソルの位置に設定します こうすることで 作文ツールは ユーザーが何も選択しない場合 ドキュメント全体を対象に 処理を行えるようになります これがコンテキストを提供する方法です これはAppKitでの例ですが このデモで特段の断りがない限り UIWritingToolsCoordinatorも NSWritingToolsCoordinatorも 同様に使用できます デリゲートメソッドは非同期です 大きいテキストビューでは基となるテキスト ストレージの処理に時間がかかるためです 関数の本文で scopeパラメータに基づいて テキストと範囲を準備します 多くの場合 コンテキストは1つ返すだけで十分です 複数のテキストストレージのテキストを 同時に選択できる 高度なテキストビューの場合 コーディネータは 複数のコンテキストもサポートします

    ビューのテキストを評価した後 作文ツールは 変更の提案を デリゲートオブジェクトに渡します このテキスト置換のデリゲートメソッドは 変更内容を ビューのテキストストレージに統合します 作文ツールはこのメソッドを 個々の変更箇所に対して呼び出します また コンテキストオブジェクトが同じ 異なる範囲の値に対して 複数回呼び出すこともできます 処理が完了すると 作文ツールは選択したテキスト範囲の更新を デリゲートに指示できます

    作文ツールによる処理中に テキストのアニメーションを表示するために コーディネータは範囲内のテキストの プレビュー画像をリクエストします

    テキストビューはプレビューとして 透明な 背景でレンダリングしたテキストを返します アニメーションの表示中 作文ツールはテキスト自体ではなく 提供されたプレビュー画像に 視覚エフェクトを適用します macOSでは この処理に デリゲートメソッドを2つ使用します 1つ目のデリゲートメソッドは 配列を受け取ります 範囲全体に対し 1つ以上のプレビューを返す必要があります アニメーションをより滑らかにするには 1行ごとに1つプレビューを返します

    iOSでは UIKitでNSTextPreviewではなく UITargetedPreviewを使用します 使用するデリゲートメソッドは1つのみです

    作文ツールは アニメーションを実際に 実行する前後に prepareForメソッドと finishメソッドを呼び出します アニメーションの準備として テキストフィールドで 特定範囲のテキストを非表示にします アニメーションが終了したら 非表示にした範囲のテキストを再表示します

    校正では 作文ツールは 変更されたテキスト範囲に 下線を表示します また 範囲内のテキストに対する クリックイベントへの応答として インラインの校正ポップアップを表示します

    校正マークを表示するために コーディネータは 各範囲の基になるベジェ曲線を返すよう デリゲートに指示します 作文ツールは クリックやタップのイベントへの応答でも 境界ベジェ曲線を必要とします

    最後に 状態の変化に 応答するためのオプションとして writingToolsCoordinator: willChangeToState:completion: メソッドを使用できます テキストフィールドの実装に応じて 併合の取り消し、 同期の停止、編集の禁止なども実行できます 逆に 外部の変更について コーディネータに通知する必要もあります updateRange:withTextを使用して 作文ツールの動作を 最新のテキストと同期させます また updateForReflowedTextを使用して ビューのレイアウトの変更を 作文ツールに通知します このメソッドを呼び出すと 作文ツールは 新しいプレビューや校正マークなどの レイアウトに依存する情報を リクエストします

    以上 作文ツールのフル機能を 強力なカスタムテキストエンジンと 統合する方法を紹介しました また 以前にサンプルコードで示した プロジェクトもリリースしました サンプルコードと 作文ツールのコーディネータに関する 完全版ドキュメントで詳細をご覧ください

    本セッションの内容は以上です 次のステップとして 作文ツールの新機能を試してみてください 変更を記述した後の フォローアップ調整などや Vision Proやショートカットアプリでの 作文ツール機能を利用できます

    テキストが多いアプリには ツールバーボタンを追加しましょう

    様々なフォーマットオプションを試して 見出し、小見出し、コードブロックなどの セマンティックスタイルの 読み書きをサポートしましょう

    強力なテキストエンジンを使用している場合 作文ツールのフル機能を活用して さらにエンジンを強化しましょう

    昨年の「Get started with Writing Tools」ビデオとサンプルコードも ぜひご覧ください ページ下部にリンクがあります サンプルコードでは 作文ツールの コーディネータの機能を確認できます ご視聴ありがとうございました

    • 11:46 - Attach a coordinator to the view (UIKit)

      // Attach a coordinator to the view
      // UIKit
      
      func configureWritingTools() {
          guard UIWritingToolsCoordinator.isWritingToolsAvailable else { return }
      
          let coordinator = UIWritingToolsCoordinator(delegate: self)
          addInteraction(coordinator)
      }
    • 12:02 - Attach a coordinator to the view (AppKit)

      // Attach a coordinator to the view
      // AppKit
      
      func configureWritingTools() {
          guard NSWritingToolsCoordinator.isWritingToolsAvailable else { return }
             
          let coordinator = NSWritingToolsCoordinator(delegate: self)
      
          coordinator.preferredBehavior = .complete
          coordinator.preferredResultOptions = [.richText, .list]
          writingToolsCoordinator = coordinator
      }
    • 13:06 - Prepare the context

      // Prepare the context
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsContextsFor scope: NSWritingToolsCoordinator.ContextScope,
              completion: @escaping ([NSWritingToolsCoordinator.Context]) -> Void) {
      
          var contexts = [NSWritingToolsCoordinator.Context]()
                      
          switch scope {
          case .userSelection:
              let context = getContextObjectForSelection()
              contexts.append(context)
              break
              // other cases…
          }
              
          // Save references to the contexts for later delegate calls.
          storeContexts(contexts)
          completion(contexts)
      }
    • 13:48 - Respond to text changes from Writing Tools and update selected range

      // Respond to text changes from Writing Tools
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              replace range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              proposedText replacementText: NSAttributedString,
              reason: NSWritingToolsCoordinator.TextReplacementReason,
              animationParameters: NSWritingToolsCoordinator.AnimationParameters?,
              completion: @escaping (NSAttributedString?) -> Void) {
      }
      
      // Update selected range
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              select ranges: [NSValue],
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping () -> Void) {
      }
    • 14:41 - Generate preview for animation (AppKit)

      // Generate preview for animation (macOS)
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsPreviewFor textAnimation: NSWritingToolsCoordinator.TextAnimation,
              of range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping ([NSTextPreview]?) -> Void) {
      }
          
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsPreviewFor rect: NSRect,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping (NSTextPreview?) -> Void) {
      }
    • 14:58 - Generate preview for animation (UIKit)

      // Generate preview for animation (iOS)
      
      func writingToolsCoordinator(_ writingToolsCoordinator: UIWritingToolsCoordinator,
              requestsPreviewFor textAnimation: UIWritingToolsCoordinator.TextAnimation,
              of range: NSRange,
              in context: UIWritingToolsCoordinator.Context,
              completion: @escaping (UITargetedPreview?) -> Void) {
      }
    • 15:08 - Delegate callbacks before and after animation

      // Generate preview for animation
      
      func writingToolsCoordinator(
          _ writingToolsCoordinator: NSWritingToolsCoordinator,
          prepareFor textAnimation: NSWritingToolsCoordinator.TextAnimation,
          for range: NSRange,
          in context: NSWritingToolsCoordinator.Context,
          completion: @escaping () -> Void) {
      
          // Hide the specific range of text from the text view
      }
      
      func writingToolsCoordinator(
          _ writingToolsCoordinator: NSWritingToolsCoordinator,
          finish textAnimation: NSWritingToolsCoordinator.TextAnimation,
          for range: NSRange,
          in context: NSWritingToolsCoordinator.Context,
          completion: @escaping () -> Void) {
      
          // Show the specific range of text again
      }
    • 15:39 - Delegate callbacks to show proofreading marks

      // Create proofreading marks
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsUnderlinePathsFor range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping ([NSBezierPath]) -> Void) {
      }
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsBoundingBezierPathsFor range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping ([NSBezierPath]) -> Void) {
      }

Developer Footer

  • ビデオ
  • WWDC25
  • 作文ツールの詳細
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習とAI
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン