macOS CatalinaにアップグレードしたらCordovaのビルドで失敗するようになった
前提
- macOS Sierraからのアップグレードした
- 念のためTime Machineでバックアップ取ってたが、ファイルシステムの違いから復元が簡単ではなくなった
- OSがアップグレードされることで、Xcodeのバージョンアップも必要となった(11.4をインストール)
- Command Line Tools for Xcodeも合わせてバージョンアップした
- CordovaプロジェクトではSwift3でプラグイン実装をしていた
- Xcodeのバージョンを上げたことからSwiftも4以上にする必要がでてきた
最初にやったこと
- XcodeのSwiftのバージョンを4.2へ変更
- バージョン変更によってビルドエラーになるプログラムを修正
cordovaビルドエラーが発生と解決策
- cordovaのビルドで以下のエラーが発生
FIXME: Implement XCBuild support for macros in overriding parameters with condition sets: CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Developer
- Xcode10から正式採用されたビルドシステムの変更のためのエラーらしい。
- Xcodeの設定でビルドシステムを元のものに戻す
- 改めてcordovaのビルドをすると正常に流れる
Swiftのプラグイン関数が未定義となり実行時エラーと解決策
- アプリを実機動作確認中に発覚
- JavaScriptからSwiftの関数を呼び出していたが、以下のような実行時エラーが発生(Xcode上のログで確認)
ERROR: Method '関数名:' not defined in Plugin 'プラグイン名'
Swift関数名の先頭に、@objc(関数名:) を付与する
修正前
func hoge(_ command: CDVInvokedUrlCommand) { }
修正後
@objc(hoge:) func hoge(_ command: CDVInvokedUrlCommand) { }
- Swiftファイルを修正して改めて実機デプロイ確認すると正常プラグイン呼び出しできるようになる
バーコード読み込み機能が動かない事象と解決策
- Swiftプラグインで実装しているバーコード読み込み機能が動かない
- 具体的には、機能の初期処理は動いているものの、バーコード読み込みされたときのイベント関数が動いていない
- 修正前は、AVCaptureMetadataOutputObjectsDelegate の captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) を利用していた。
- 関数名が変わっていたため、metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) に変更
- 上記変更で正しくバーコード読み込みされたときに、metadataOutput関数が実行されるようになる
cordovaビルドで再びエラーが発生と解決策
- cordovaのビルド解決していたと思いきや、再びエラーが発生。内容は以下のメッセージ
Cannot read property 'toLowerCase' of undefined
- Xcodeのバージョンが11になったことで、cordovaプラットフォームのiOSのバージョン(このときは、4.5.5を指定していた)を5系に上げなければいけないらしい
- 以下のようなコマンドでプラットフォームを作り直そうとしたが、既存の独自プラグインやらXcode上で指定していたライブラリの依存関係、CocoaPosdの設定などが消えてしまい、この方法は時間があるときに改めてやることにした。
cordova platform rm ios cordova platform add ios@latest