Cordovaプラグインのアップデートで発生するエラーとその対処法
Cordova環境のアップデートをやっているのですが、プラグインのアップデートで結構ハマったので、対処法をまとめておきます。
Cordovaプラグインのアップデート方法
プラグインのアップデートは、以下のコマンドで行います。
$ cordova plugin rm {プラグイン名} $ cordova plugin add {プラグイン名}
ただし、プラグインがもう存在していないと、rmで削除した後、addで追加できなくなります。
cordova plugin search
コマンドなどで事前に存在を確認した方がよいでしょう。
Xcodeでのビルド時のエラー
Xcodeでビルドすると以下のようなエラーが発生する場合があります。
[INF] [shellscript] Undefined symbols for architecture i386: [INF] [shellscript] "_OBJC_CLASS_$_SKMutablePayment", referenced from: [INF] [shellscript] objc-class-ref in InAppPurchase.o [INF] [shellscript] "_OBJC_CLASS_$_SKPaymentQueue", referenced from: [INF] [shellscript] objc-class-ref in InAppPurchase.o [INF] [shellscript] "_OBJC_CLASS_$_SKProduct", referenced from: [INF] [shellscript] l_OBJC_$_CATEGORY_SKProduct_$_LocalizedPrice in SKProduct+LocalizedPrice.o [INF] [shellscript] "_OBJC_CLASS_$_SKProductsRequest", referenced from: [INF] [shellscript] objc-class-ref in InAppPurchase.o [INF] [shellscript] "_OBJC_CLASS_$_SKReceiptRefreshRequest", referenced from: [INF] [shellscript] objc-class-ref in InAppPurchase.o [INF] [shellscript] ld: symbol(s) not found for architecture i386 [INF] [shellscript] clang: error: linker command failed with exit code 1 (use -v to see invocation)
これは、cordova-plugin-purchaseプラグインで発生したものです。
エラーメッセージでググってみると、プラグインをアップデートした時に、リンクするライブラリの設定が入らなかったようです。
※Cordovaのバグっぽいですが。
そこで、手動でリンクの設定を追加します:
- TARGETS > {アプリ名}> Build Phases タブ を選択します。
- Link Binary With Libraries の欄を開きます。
- 一番下にある+ボタンをクリックします。
- StoreKit.framework を追加します。
これでエラーが出なくなりました。
なお、追加するライブラリはプラグインごとに異なるので、エラーメッセージでググって見つける必要があります。
参考:
InAppPurchaseManager (iOS) + Cordova 2.9? - Google グループ
Xcodeでの実行時のエラー
ビルドが成功した後、実行時に以下のようなエラーが発生する場合があります。
2015-03-05 14:47:20.313 App1[98835:3903561] CDVPlugin class CDVStatusBar (pluginName: StatusBar) does not exist. 2015-03-05 14:47:20.313 App1[98835:3903561] ERROR: Plugin 'StatusBar' not found, or is not a CDVPlugin. Check your plugin mapping in config.xml.
ググってみると、「Cordovaを再インストールする」という方法が見つかるのですが、環境が壊れると困るのでやめました。
エラーメッセージからすると、プラグインのクラスが認識されていないようなので、ソースが組み込まれていない可能性が高いと考えました。
そこで、以下の手順でソースを組み込みました:
- TARGETS > {アプリ名}> Build Phases タブ を選択します。
- Compile Souces の欄を開きます。
- 一番下にある+ボタンをクリックします。
- CDVStatusBar.m を追加します。
これで、エラーが出なくなりました。
アーキテクチャ関連のエラー
上のエラーメッセージにもありますが、「Undefined symbols for architecture i386」というようなエラーが発生することがあります。
この種のエラーの対処方法として、32ビットのアーキテクチャを追加したり、64ビットのアーキテクチャを削除するという方法が見つかりますが、64ビット対応でないとAppStoreでリジェクトされる可能性があるので、今はこういった方法は取るべきではありません。
このようなエラーは、Build Active Architecture Only の設定をNoにすることで解消できました。(PROJECT > Build Settings > Architectures)
なお、メインプロジェクトとCordovaLibプロジェクトの両方の設定を変更する必要があります。
環境
Cordova 4.3.0
cordova-ios 3.8.0
Xcode 6.1.1