Xcode8、iOS10にアップデートしたらシミュレーター、デバイスともにビルドで失敗する
Cordovaでのアプリ開発も佳境を迎えていた昨今、MacBook AirとiPod touchのOSとXcodeを更新したらアプリがビルドで失敗するようになって動作確認ができなくなったので、その時の対応方法について記します。
目次
- 環境
- 事象
- エラー内容、対応方法
- イメージ選択時のエラー
- 参考リンク
環境
「Visual Studio Tools for Apache Cordova」をベースにモバイルアプリ開発
MacBook AirにiPod touchをつないで、Visual Studioからリモートデバイス、またはシミュレーターにてiOSアプリの動作確認
事象
「iOS10」がリリースされたので、iPod touchのOSを更新。
⇒ リモートデバイスでの動作確認ができなくなる。
MacBook AirのOSを「macOS Sierra」に更新し、ついでにXcodeを7から8に更新。
⇒ シミュレーターでの動作確認ができなくなる。
エラー内容、対応方法
まず、config.xmlのプラトフォーム「Cordova CLI」に設定されているCordovaのバージョンを「6.0.0」から「6.1.1」に変更。変更した理由は「6.0.0」ではエラーの内容が漠然としすぎていたため。幸い「6.1.1」に変更したことでのソースの修正はありませんでした。
以下はエラーの内容です。
Build failed with error Error code 65 for command: xcodebuild with args: -xcconfig,/Users/~
ちなみに6.0.0でのエラーは以下の通り。
Build failed with error invalid data
対応方法については以下の通り。
①「build.json」に設定追加
②「xcode8.js」ファイルを「プロジェクトルート/hooks」配下に設置
③「config.xml」に「xcode8.js」のファイルパスを追加
詳細は以下の通り。
①「build.json」に設定追加。
{
"ios": {
"debug": {
"developmentTeam": "ABCD12345Z"
},
"release": {
"developmentTeam": "ABCD12345Z",
"codeSignIdentity": "iPhone Developer"
}
}
}
「developmentTeam」にはApple Developerで登録したApp IDのPrefixを設定すればいいみたい。「codeSignIdentity」は「iPhone Developer」固定、でいいのかな...
なお、エラーの内容は忘れてしまいましたが、build.jsonをテキストファイルとして手動で作成した場合、バイナリエディタで先頭の3バイトを削除しないとエラーが出てビルドできないといったことがあったので、注意が必要です。(Cannot build signed android package through visual studio cordova - Stack Overflow)
②「xcode8.js」ファイルを「プロジェクトルート/hooks」配下に設置
(ファイルはこちらからダウンロード。)
③「config.xml」に「xcode8.js」のファイルパスを追加
<platform name="ios">
<hook type="before_compile" src="hooks/xcode8.js" />
</platform>
上記の①~③の対応で、ビルドは正常に終了するようになりますが、アプリは起動しません。
ターゲットが「シミュレーター」の場合は、ビルドされたアプリが設置されますが、起動はしないので、ビルド後に自分でシミュレーターを操作して起動します。
一方、「デバイス」の場合は、MacBook Air上での操作が必要で、以下はその手順になります。
④Macのターミナルからプロジェクトを起動。
cd /Users/{USER_NAME}/.taco_home/remote-builds/taco-remote/builds/{BUILD_NO}/cordovaApp/platforms/ios
open /Applications/Xcode.app/ sample.xcodeproj/
⑤起動したXcodeからシミュレーターまたはデバイスを選択して実行。
上記のようにビルド後の設置・起動でうまくいかない事象は、私の環境で発生したもので、他で発生するかどうかは不明です。
結果として今までの動作確認での作業が一つ増えてしまってるので、自分の環境だけなのか、それともVisual Studioのせいなのかどうなのか分かりませんが、今後、改善したいところです。
イメージ選択時のエラー
ビルド正常終了後の動作確認で、イメージ選択時にアプリが強制終了するようになっていました。
原因は、iOS10からイメージ選択時のフォトライブラリへのアクセスでパラメータ「PHOTO_LIBRARY_USAGE_DESCRIPTION」が必要になったようで、パラメータを設定していないとアプリがクラッシュします。
エラーの内容は以下の通り。
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
開発していたアプリでは、イメージ選択のプラグイン「cordova-imagePicker」を使っていたので、プラグインを一度削除して再インストールしようとすると、パラメータ「PHOTO_LIBRARY_USAGE_DESCRIPTION」の内容を設定できるようになっています。
設定に「アップロード画像の選択」と記述すると、イメージ選択時に以下のように表示されます。