Cordova アプリで iOS 向けにユーザデータへのアクセス許可を求めようとしてつまづいたところ
今日話す内容は、
- NS【xxx】UsageDescription
config.xml
の<edit-config>
doc.find is not a function
…といったキーワードに関連する話。
Cordova アプリでカメラを使いたく、iOS 向けにユーザデータへのアクセス許可を求めるための設定を入れた。
具体的には、NSCameraUsageDescription
に対応するアクセス許可を求めるメッセージを、config.xml
内に edit-config
要素を使って書いた。ちょうど、cordova-plugin-camera の README に書かれているやり方だ。
<?xml version='1.0' encoding='utf-8'?>
<widget id="neos21" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>Neos21</name>
<!-- …中略… -->
<edit-config target="NSCameraUsageDescription" file="*-Info.plist" mode="merge">
<string>need camera access to take pictures</string>
</edit-config>
<edit-config target="NSPhotoLibraryUsageDescription" file="*-Info.plist" mode="merge">
<string>need photo library access to get pictures from there</string>
</edit-config>
<edit-config target="NSLocationWhenInUseUsageDescription" file="*-Info.plist" mode="merge">
<string>need location access to find things nearby</string>
</edit-config>
<edit-config target="NSPhotoLibraryAddUsageDescription" file="*-Info.plist" mode="merge">
<string>need photo library access to save pictures there</string>
</edit-config>
</widget>
こんな感じ。
こんなアプリを一旦構築して、しばらくちゃんと動いていたのだが、開発環境を変えた時に $ cordova prepare
コマンドで環境復元したところ、以下のようなエラーメッセージが出るようになってしまった。
# cordova prepare した後、例えば Cordova ビルドとかする時に…
$ cordova build ios
(node:2519) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: doc.find is not a function
doc.find is not a function
とはなんぞや?と思って調べてみると、Cordova のバグチケットが起票されていた。
- CB-13694 UnhandledPromiseRejectionWarning when throwing errors - ASF JIRA
- CB-13564 Multiple edit-config items for Info.plist causing error - ASF JIRA
どうやら、config.xml
に edit-config
要素を複数書いている時に、cordova prepare
コマンドで正常に復元ができないようだ。
解決策はというと、iOS プラットフォームを入れ直す。
$ cordova platform rm ios
$ cordova platform add ios
こうすると、本来は cordova prepare
と同等の結果になるはずだが、どうも cordova prepare
では上手くいかず、cordova platform add
なら上手くいくようだ。
チケットを見る限り、Node.js と npm のバージョンを上げたら直るやろ的なコメントもあるが、これは Cordova 側が直せよ…と思うんだよな…。