Xode12 beta5ドキュメントアプリをビルドすると新規ドキュメントを開始できない状態になっている。次のXcode12、iOS14 SDKでは修正される可能性があるもAppleの修正を待っていてもドキュメントアプリ開発は進まないので回避方法についてのメモ。
追記 2020/8/26
Xcode12 beta6およびiOS/iPadOS beta6で新規ドキュメントを開始できない問題は解消しました。
1) 何が起きている?
ドキュメントアプリをXcode12 beta5のプロジェクトテンプレートで作成しビルド、実行するとFileアプリケーションライクな画面が起動する。本来なら起動画面で新規にファイル作成すると本来のアプリが起動するが、新規ドキュメントを作成に失敗するのでアプリが起動しない。
Xcode12 beta5より前のbeta版テンプレートで作成したプロジェクトでも同様の問題が起きる。
2) 影響範囲は?
Multiplatformドキュメントアプリ(SwiftUI)のiOSターゲット、iOSドキュメントアプリに影響がある。シミュレーター、実機でも影響がある。
MultiplatformドキュメントアプリのmacOSターゲット、macOSは影響を受けない。
3) 原因は?
DocumetBaseApplication(iOS14以前のDocumetAppの名称)ではドキュメント新規作成時の方法を3つから選ぶことができた。
- 何もない状態
- 別のパスから移動
- 別のパスからコピー
何もない状態から新規作成する条件のみiOS, iPadOSで失敗する。
新規ドキュメントを別のパスから移動している方法を採用しているサンプルコードの場合はbeta5でも動作する。
[iOS]今からはじめるドキュメントベースApp - Qiita
Multiplatformドキュメントアプリでは別のパスを指定できるオプションがないのでコードでの回避方法がない。
4) 回避方法(シミュレーター)
アプリのドキュメントフォルダに既存のドキュメントファイルを配置して、新規作成ではなく既存ファイルのオープンでアプリが起動しない問題を回避する。
4-1)ドキュメントフォルダの確認
ドキュメントフォルダは以下のコードをFileDocument、ReferenceFileDocument の初期化コードに記述してドキュメントフォルダの位置をログを出力してドキュメントフォルダのパスを確認する。
let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
print("path=\(path)")
4-2)ドキュメントフォルダに既存ファイル作成
Xcode12のドキュメントアプリのテンプレートの場合はMultiplatform、iOS、macOS共に拡張子exampletext のプレーンテキストファイルをオープンすることはできるのでテキストエディタで[ファイル名].exampletext を作成する。
作成した[ファイル名].exampletext を確認したドキュメントフォルダに格納する。
4-2) 既存ファイルを開いてアプリ動作を確認
Xcode12 beta5でドキュメントアプリプロジェクトを実行する。Fileアプリケーションライクな画面が起動する。4-2で配置したファイルが確認できるはずなので、タップしてオープンする。
気をつける点はファイルブラウザ画面ではファイルアクセス方法として、
- 最近開いたファイル
- このiPhone(iPad)上
- iCloudDrive
がある。この場合はこのiPhone(iPad)上をタップすると配置した既存ファイルが確認できる。
Note:
拡張子が異なる場合は半透明状態になりオープンすることができない。
5) 回避方法(実機)
4で作成した。既存ファイル(テンプレートままなら拡張子exampletextのプレーンファイル)をiCloudDriveに配置、デバッグ時にiCloudDrive を開くと既存ファイルが表示されてるのでこちらをオープンする。
6) まとめ
Xcode12 beta5 にしてドキュメントアプリに深刻な不具合が入っていた。幸い回避方法があるのでXcode12のアップデートがあるまで役立てて欲しい。