Mac Catalystでファイルを開く/保存する


要はNSOpenPanel、NSSavePanelでやってたことをMac CatalystでつくったmacOSアプリではどう実現するか、という話

## UIDocumentBrowserViewControllerを使う

let browser = UIDocumentBrowserViewController(forOpeningFilesWithContentTypes: types)
present(browser, animated: true, completion: nil)

これだけ。macOSで実行するとNSOpenPanel的なものでmacOSのファイル階層をたどってファイル指定できる。

引数`forOpeningFilesWithContentTypes`にはUniform Type Identifier (UTI) をString型で指定する。

たとえば画像だけ選択できるようにしたい場合はこうなる。

let types = [kUTTypeImage as String]

UTIの一覧はこちら。

## UIDocumentPickerViewControllerを使う

UIDocumentBrowserViewControllerとほぼ同じように使えるので解説を省略。ちなみにこっちのほうが古いようだが、違いはよくわかってない。(必要が出てきたら調べる)

## ファイルアクセスタイプの指定

ただし上の実装だけでMac向けにビルドしていざファイルを選択しようとすると、

ERROR: Unable to display open panel: your app is missing the User Selected File Read app sandbox entitlement. Please ensure that your app's target capabilities include the proper entitlements.

というエラーになる。

ファイルアクセスのアクセス権の設定が必要。

具体的には、[Signing & Capabilities] > [App Sandbox]の欄で、各File Access Typeに対して必要なPermission&Accessを選択する。

画像1

これをやると`.entitlements`ファイルに必要なkey&valueが追加されていく。

ちなみにopenするにもexportするにもwrite権限が必要なようだ。

## ファイル選択されたときの処理の実装

ファイル選択されたときのイベントをハンドリングするにはUIDocumentBrowserViewControllerDelegateに準拠する。ちなみにどのメソッドもoptional。ファイル選択時には〜didPickDocumentsAt〜が呼ばれる。


extension ViewController: UIDocumentBrowserViewControllerDelegate {
   func documentBrowser(_ controller: UIDocumentBrowserViewController, didPickDocumentsAt documentURLs: [URL]) {
       print(documentURLs)
   }
}

これを実装した上で、`UIDocumentBrowserViewController`の`delegate`プロパティにオブジェクトをセット。

browser.delegate = self

UIDocumentPickerViewControllerの場合もほぼ同様なので省略。

## フォルダを選択させる

これはStackOverflowでも質問への回答がなくなかなか困った。

ここから先は

620字

¥ 300

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/