目次
Session概要
ドキュメントベースのアプリをSwiftUIのみで構築する方法について。DocumentGroup APIについて確認し、AppやSceneをどのように構成するかについて。ドキュメントブラウジングや標準コマンドなどの文書管理にすぐ使うことのできるサポートを加えることが可能となります。Universal Type Identifierのセットアップ方法や一流のドキュメントベースのアプリを構成する内容について学ぶことができます。
https://developer.apple.com/videos/play/wwdc2020/10039/
ドキュメントとは
- FinderやFileアプリではファイルを管理しており、タグやクラウドファイルプロバイダのような機能や外付けデバイスを使用して整理できます
- このようなアプリを使用してシームレスに所定のファイルを開き、閲覧,編集が可能です
- 上記を実現するには、まずファイルをデータベースにimportすることでアプリで管理できるようになる
- ドキュメントを編集する際にはオリジナルのドキュメントのコピーを編集しており、オリジナルは変更されていない
- KeynoteやFinal Cut Proなどのアプリの機能には、ユーザがドキュメントの管理ができるようにしており、このようなアプリの挙動をドキュメントベースアプリと呼ぶ
DocumentGroup

- ドキュメントベースのアプリを実装するには、DocumentGroupと呼ばれるSceneタイプを使用する
- DocumentGroupはドキュメントコンテンツの複数のウィンドウを開くことができる
- ドキュメントアプリ特有の標準UI要素を含みます
- Mac上のステートトラッキングやHandoff
- 検索フィールド月のドキュメントブラウザやナビゲーションバー、iOS上の共有機能など


シンプルなテキスト編集アプリの例
@main
struct TextEdit: App {
var body: some Scene {
// DocumentGroupを使用することで、所定のドキュメントタイプを開き管理するということを宣言している
DocumentGroup(newDocument: TextDocument()) { file in
// 基となるデータモデルへread, writeアクセスを可能にする
TextEditor(text: file.$document.text)
}
}
}
ドキュメントベースアプリの実装方法
- プロジェクト作成時に Document App を選択する
- Info.plistにあるIdentifierがUniversal Type Identifier
- システムはこの識別子を使用してファイルとアプリを関連付けし、システム上で識別子を認識するとアプリ内でこのタイプのドキュメントを開くことを認識する
- Exported Type Identifierセクション
- Identifierを入力し、ファイルの正当な所有者であることを通知する必要がある
- Extensionsで拡張子の設定、Conforms Toでアクセス制限などが可能
- FileDocumentプロトコルに準拠するstructを実装する
- プロジェクト作成時にテンプレートが作られる
- これはディスク上のドキュメントの表現を指す
- readableContentTypesプロパティにread可能なコンテンツタイプを定義する
- UTTypeはInfo.plistのDocument Typeセクションへの入力値と一致させ、UTType(exportedAs:)で定義する
- writeメソッドで新規のFileWrapperを作成するか、更新するかのどちらかが可能
- ※ writeメソッドは提供されておらず、 writableContentTypes に定義する??
- ※ writeメソッドは提供されておらず、 writableContentTypes に定義する??

