Cordova アプリで iOS 向けにユーザデータへのアクセス許可を求めようとしてつまづいたところ

今日話す内容は、

…といったキーワードに関連する話。


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 のバグチケットが起票されていた。

どうやら、config.xmledit-config 要素を複数書いている時に、cordova prepare コマンドで正常に復元ができないようだ。

解決策はというと、iOS プラットフォームを入れ直す。

$ cordova platform rm ios
$ cordova platform add ios

こうすると、本来は cordova prepare と同等の結果になるはずだが、どうも cordova prepare では上手くいかず、cordova platform add なら上手くいくようだ。

チケットを見る限り、Node.js と npm のバージョンを上げたら直るやろ的なコメントもあるが、これは Cordova 側が直せよ…と思うんだよな…。