ObjecTips

Swift & Objective-C で iOS とか macOS とか

iOS 10 + UIDocumentPickerViewController でクラッシュ

クラッシュ時のコンソールログは以下

*** Assertion failure in -[UIDocumentPickerViewController _commonInitWithCompletion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3599.6/UIDocumentPickerViewController.m:91
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application initializing document picker is missing the iCloud entitlement. Is com.apple.developer.icloud-container-identifiers set?'

アプリで iCloud の機能は使っていなくても iOS 10 で UIDocumentPickerViewController を利用する場合は Capabilities で iCloud をオンに設定しておく必要があるらしい。
かつ Files app の導入された iOS 11 以降だと Capabilities での設定不要で問題なく動作するので見落としがち。*1
今回は2019年の iOS 12 時代になってからようやく UIDocumentPickerViewController を機能として初導入したアプリだったので iOS 10 での動作チェック漏れでクラッシュが起きた。

選択肢としては iOS 11 以降のみで UIDocumentPickerViewController の呼び出しボタンを表示する様に分岐する、またはアプリでは iCloud は使ってないけど Capabilities で iCloud をオンにしておくという2つがあると思う。
ちなみに iCloud をオンにして Key-value storage のみを使う様にチェックして、iCloud Documents はチェックしないでおけば iCloud のコンテナ等の設定無しに UIDocumentPickerViewController での iCloud Drive へのアクセスが可能な様なので、Key-value storage にチェックだけしておいてアプリでは Key-value storage の機能を使用しないでおくのが一番影響が少ないと思われる。

f:id:Koze:20190522230217p:plain

*1:iOS 11 以降では UIDocumentPickerViewController イコール Files へのアクセスなのに対して、iOS 10 では UIDocumentPickerViewController イコール iCloud Drive へのアクセスとなるためだと思われる。