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のバグっぽいですが。

そこで、手動でリンクの設定を追加します:

  1. TARGETS > {アプリ名}> Build Phases タブ を選択します。
  2. Link Binary With Libraries の欄を開きます。
  3. 一番下にある+ボタンをクリックします。
  4. 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を再インストールする」という方法が見つかるのですが、環境が壊れると困るのでやめました。

エラーメッセージからすると、プラグインのクラスが認識されていないようなので、ソースが組み込まれていない可能性が高いと考えました。

そこで、以下の手順でソースを組み込みました:

  1. TARGETS > {アプリ名}> Build Phases タブ を選択します。
  2. Compile Souces の欄を開きます。
  3. 一番下にある+ボタンをクリックします。
  4. 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

関連記事