ionicのプラグインを作る時につまずいたこと

最近、ionicのJSからiOSの機能を使えるようにするプラグインを作ることがあったので、その際にいくつかつまずいたので解決方法をまとめておきます。

何度もJSのコールバックを呼びたい

ネイティブ側から何度もJSのコールバックを呼びたい時は、CDVPluginResultに setKeepCallbackAs(true) を呼び出す必要があります。

let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "Hello")
result.setKeepCallbackAs(true)
commandDelegate.send(result, callbackId:command.callbackId)

通常は一度しかcallbackIdを使えないのですが、こうすることで何度もcallbackIdに対して結果を通知することができます。

あきらめかけた時に下記の記事を読んでいたら書いてありました。

Beacapp SDK を Cordova Plugin 化してみた

非同期にJSのコールバックを呼びたい

callbackIdをインスタンス変数に保存することで、非同期の処理が終わったタイミングでコールバックを呼ぶことができました。

private var saveCallbackId: String? = nil

func hello(_ command: CDVInvokedUrlCommand) {
    saveCallbackId = command.callbackId

    // 非同期処理
    ... {
        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: "hello")
        commandDelegate.send(result, callbackId:saveCallbackId) 
    }
}

プラグインの開発、デバッグの方法

そもそもネイティブの機能を開発、デバッグをどうすればいいのか全く分からず手探りやっていました。その中で、ほどほどに速度が出て開発しやすい方法を見つけました。

  1. とりあえず本体のプロジェクトにプラグインをインストールする
  2. Xcodeで本体プロジェクトを開いて、Pluginsにあるプラグインのファイルを直接編集して開発を進めていく
  3. 動くようになったら、そのファイルの内容をコピーして、プラグインのファイルに貼りつけてプラグインを再インストールする

他にも方法があると思いますが、この方法だと普通にiOSの機能を開発している時と変わらず開発を進めることができました!


ionic(cordova)のプラグインの詳細をまとめた記事があまりなかったので、公式ドキュメント を読んだり、公式のcordova-plugin-geolocationcordova-plugin-ble-centralソースコードを読みながら開発を進めました。

今回サンプルで作ったリポジトリも置いておきます!プラグインには下記のメソッドが含まれています。

  • 引数にhelloを付けて返す
  • タイマーで5秒おきに処理を実行する
  • ユーザーの現在地を取得する

ionic-sample