Xcode10 にアップデートしてから Cordova ビルドが失敗する

iOS12 に対応するため Xcode10 にアップデートしたら、cordova build (および cordova emulatecordova run) が失敗するようになった。

error: archive not found at path '/Users/Neo/example/platforms/ios/example.xcarchive'
** EXPORT FAILED **

(node:5225) UnhandledPromiseRejectionWarning: Error code 65 for command: xcodebuild with args: -exportArchive,-archivePath,example.xcarchive,-exportOptionsPlist,/Users/Neo/example/platforms/ios/exportOptions.plist,-exportPath,/Users/Neo/example/platforms/ios/build/device
(node:5225) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:5225) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process witha non-zero exit code.

試しに Xcode を開いてコチラからビルドしてみると、以下のエラーメッセージが出た。

The executable was signed with invalid entitlements.

The entitlements specifid in your application's Code Signing Entitlements file are invalid, not permitted, or do not match those specified in your provisioning profile. (0xE8008016).

調べてみると、どうやらプロビジョニングプロファイルが iPhone 端末の方にインストールされていないせいでエラーが出ているようだ。

Xcode のメニューバーより、Window → Devices and Simulators → 【iPhone 端末名】 で右クリックして Show Provisioning Profiles... → インストールされているプロビジョニングプロファイルを見てみると、インストールしたいアプリのプロビジョニングプロファイルがない。そこで、「+」ボタンを押し、手動でプロビジョニングプロファイルをインストールする。

オートサイニングで生成されたプロビジョニングプロファイルは ~/Library/MobileDevice/"Provisioning Profiles/" 配下にランダムなファイル名で格納されているのだが、Finder 風のダイアログにはなぜか ~/Library/ が表示されず、普通には遷移できない。仕方がないので、予め ~/Library/MobileDevice/"Provisioning Profiles/" ディレクトリをサイドバーに入れておき、そこから辿るようにした。ファイル名では目的のプロビジョニングプロファイルが探しづらいが、更新日時とかでチェックする (プレビューで App ID とかが分かる)。


一度こうやって iPhone にプロビジョニングプロファイルをインストールしてやれば、Xcode からはビルドとインストールができるようになった。しかし、相変わらず $ cordova run ios コマンドなどが失敗してしまう。

もう少し調べてみたところ、cordova-ios がまだ Xcode 10 に対応していないために出ているエラーのようだ。

Xcode10 からデフォルトのビルドシステムが変わり、cordova-ios がまだそれに追随できていないので、エラーになるようである。

一旦の回避方法は、--buildFlag="-UseModernBuildSystem=0" というオプション引数を渡す、というモノ。

$ cordova build ios --buildFlag="-UseModernBuildSystem=0"

このようにすれば、ビルドは通るようになる。

しかし、$ cordova run ios --buildFlag="-UseModernBuildSystem=0" とした場合、実機へのインストールまでは上手く行くものの、その後アプリが起動せず。

Xcode のバージョンアップに追随しきれておらず、Cordova はなかなか厳しいなぁ…。