ionic(cordova)でのプラグイン開発のながれメモ

開発のながれ

1. 新規プロジェクト作成(既存のプロジェクトに追加する場合は不要)
2. プラグインの開発
必要なディレクトリとファイルを作成

$ tree plugins-dev/
plugins-dev/
└── plugin-sample
    ├── plugin.xml
    ├── src
    │   ├── android
    │   │   └── Sample.java
    │   └── ios
    │       └── Sample.swift
    └── www
	└── sample.js

3. 上記のファイルを編集してプラグイン開発
4. 作成したプラグインをプロジェクトに追加
5. プログラム(js)からプラグインを呼び出すようにしたり
プラグインの修正は以下を繰り返す
プラグインを修正
プラグインを削除して追加
・動作確認(自分の場合は、xcodeまたはandroid studioでビルドしてる)

実装 - iOS

新規プロジェクト作成
$ ionic start SamplePlugin blank
必要なフォルダを作成
# プラグイン開発用フォルダ
$ mkdir plugins-dev

# 開発するプラグイン用のフォルダ
$ mkdir plugins-dev/plugin-sample

# ネイティブのコード用のフォルダ
$ mkdir plugins-dev/plugin-sample/src
$ mkdir plugins-dev/plugin-sample/src/ios

# Javascript用のフォルダ
$ mkdir plugins-dev/plugin-sample/www
必要なファイルを作成

plugin-dev/plugin-sample/plugin.xml

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
        id="plugin-sample"
        version="0.1">

  <name>Sample</name>
  <description>Sample Plugin</description>

  <js-module src="www/sample.js">
    <!-- 呼び出す時の名前 -->
    <clobbers target="sample" />
  </js-module>

  <!-- iOS -->
  <platform name="ios">
    <config-file target="config.xml" parent="/*">
      <feature name="Sample">
        <param name="ios-package" value="Sample" />
      </feature>
    </config-file>
    <source-file src="src/ios/Sample.swift" />
  </platform>

</plugin>

plugins-dev/plugin-sample/www/sample.js

'use strict';

var exec = require('cordova/exec');

var Sample = {

  initialize: function(param, onSuccess, onFail) {
    return exec(onSuccess, onFail, 'Sample', 'initialize', [param]);
  }

};

module.exports = Sample;

plugins-dev/plugin-sample/src/ios/Sample.swift

import Foundation

@objc(Sample) class Sample : CDVPlugin {

    func initialize(_ command: CDVInvokedUrlCommand) {
        // パラメータの取得
        //command.arguments

        // 正常
        let result = CDVPluginResult(status: CDVCommandStatus_OK)
	commandDelegate.send(result, callbackId:command.callbackId)
    }
}
プラグインをプロジェクトに追加
# 追加
$ ionic plugin add plugins-dev/plugin-sample

# 確認
$ ionic plugin ls
・・・
cordova-plugin-console 1.0.6 "Console"
cordova-plugin-device 1.1.5 "Device"
cordova-plugin-splashscreen 4.0.2 "Splashscreen"
cordova-plugin-statusbar 2.2.2 "StatusBar"
cordova-plugin-whitelist 1.3.2 "Whitelist"
ionic-plugin-keyboard 2.2.1 "Keyboard"
plugin-sample 0.1 "Sample" # ★今回追加したプラグイン
プラグインを呼び出す部分の実装

www/js/app.js

angular.module('starter', ['ionic'])

.run(function($ionicPlatform) {
  $ionicPlatform.ready(function() {

    ・・・

    // プラグイン呼び出し
    sample.initialize({
      api_key: "1234567890"
    });

  });
})
動作確認
$ ionic prepare

# platforms/ios以下に反映されるのでSamplePlugin.xcodeprojファイルを開いてビルド

実装 - android

プロジェクトにandroidを追加
$ ionic platform add android

# 確認
$ ionic platform ls
・・・
Installed platforms:
  android 6.1.2
  ios 4.1.1
Available platforms:
・・・
android用のプラグインを開発

plugin-dev/plugin-sample/plugin.xml

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
        id="plugin-sample"
        version="0.1">

  ・・・

  <!-- Android -->
  <platform name="android">
    <config-file target="res/xml/config.xml" parent="/*">
      <feature name="Sample">
        <param name="android-package" value="plugin.sample.Sample"/>
      </feature>
    </config-file>
    <source-file src="src/android/Sample.java" target-dir="src/plugin/sample" />
  </platform>

</plugin>

plugins-dev/plugin-sample/src/android/Sample.java

package plugin.sample;

import org.apache.cordova.*;
import org.json.JSONArray;
import org.json.JSONException;

public class Sample extends CordovaPlugin {

    @Override
    public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {

        if (action.equals("initialize")) {
            // パラメータ
            //data.getString

            // 正常
            callbackContext.success();
            return true;
        } else {
            return false;
        }
    }
}
プラグインの修正をプロジェクトへ反映
# 1度削除
$ ionic plugin rm plugin-sample

# 再度入れ直す
$ ionic plugin add plugins-dev/plugin-sample
動作確認
$ ionic prepare

# platforms/androidに反映されるのでこれをAndroid Stduioから開いてビルド

おわりに

とりあえず基本的な流れだけまとめた。実際にはネイティブ向けに公開されているSDKプラグインを開発することになると思うので、SDKの組み込みとかが入ってくると思うので次回まとめてみる。

参考URL
http://kinsentansa.blogspot.jp/2015/09/swiftcordovaionicplugin.html
http://qiita.com/betchi/items/f9efc82c1bc051a2f518