yasutomogのブログ

Software Engineerの雑記

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へ変更
    f:id:yasug:20200401173008p:plain
    swift_version
  • バージョン変更によってビルドエラーになるプログラムを修正

cordovaビルドエラーが発生と解決策

  • cordovaのビルドで以下のエラーが発生
FIXME: Implement XCBuild support for macros in overriding parameters with condition sets:
CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Developer
  • Xcode10から正式採用されたビルドシステムの変更のためのエラーらしい。
  • Xcodeの設定でビルドシステムを元のものに戻す
    f:id:yasug:20200401174756p:plain
    xcode_build_system
  • 改めて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
  • 取り急ぎの対策としては、Xcodeのバージョン10をインストールした
  • 取り急ぎの対策ではあるので、以前いれているXcodeのバージョン11は残しつつ、xcode-selectで切り替えれるように対応
  • こうすることで、cordovaビルドでエラーが消えたと思ったら、再発した。
  • 同じ環境とコードでビルドエラーが発生したりしなかったりしたがある法則が見つかった
  • 実機(iPhone)を接続しているとエラーが発生しない、接続していないとエラーが発生する。
  • 以下のGitHubコメントにあった対応も試してみたら、これは実機の接続有無関係なくビルドが通ることを確認できた github.com