携わっているプロジェクトで使用することになったのでメモがてら

Cordova Plugin の作成

ディレクトリ作成

プラグイン開発は以下のフォルダ構成で行います。

./custom_plugins
└── cordova-plugin-helloworld
    ├── package.json
    ├── plugin.xml
    ├── src
    │   ├── android
    │   │   └── HelloWorld.java
    │   └── ios
    │       └── HelloWorld.swift
    └── www
        └── helloworld.js

package.json の作成

package.json の内容は以下の通りです。

{
  "name": "cordova-plugin-helloworld",
  "version": "1.0.0",
  "cordova": {
    "id": "cordova-plugin-helloworld",
    "platforms": [
      "android",
      "ios"
    ]
  }
}

plugin.xml の作成

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
  xmlns:android="http://schemas.android.com/apk/res/android"
  id="cordova-plugin-helloworld"
  version="1.0.0">

  <name>HelloWorld</name>
  <description>HelloWorld!!!</description>
  <license>HogeLicense</license>
  <engines>
    <engine name="cordova-android" version=">5.0.0"/>
  </engines>
  <js-module src="www/helloworld.js" name="HelloWorld">
    <clobbers target="HelloWorld"/>
  </js-module>

  <platform name="ios">
    <config-file target="config.xml" parent="/*">
      <feature name="HelloWorld">
        <param name="ios-package" value="HelloWorld" onload="true" />
      </feature>
    </config-file>
    <source-file src="src/ios/HelloWorld.swift" />
  </platform>

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

helloworld.js の作成

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

module.exports = {
  echo: function (name, successCallback, errorCallback) {
    exec(successCallback, errorCallback, "helloworld", "echo", [name]);
  },
};

HelloWorld.java の作成(Android Native)

package plugin.helloworld;

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

public class HelloWorld extends CordovaPlugin {

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

        if (action.equals("echo")) {
            String name = data.getString(0);
            String message = "Hello, World !!! " + "Hello, " + name;
            callbackContext.success(message);
            return true;
        } else {
            return false;
        }
    }
}

HelloWorld.swift の作成(iOS Native)

import Foundation
import UIKit

@objc(HelloWorld) class HelloWorld: CDVPlugin {
    @objc(echo:)
    func echo(command: CDVInvokedUrlCommand) {

        let name = command.arguments.first as! String
        let message = "Hello, World !!! " + "Hello, " + name;

        let result = CDVPluginResult(status: CDVCommandStatus_OK, messageAs: message)

        self.commandDelegate!.send(result, callbackId: command.callbackId)

    }
}

一旦作成した Plugin を使ってみる

空の Ionic プロジェクトを作成し、上記で作成したプラグインを add する

$ ionic start plugin-test blank
$ cd plugin-test

プラグインの追加

$ ionic cordova plugin add ./custom_plugins/cordova-plugin-helloworld

アプリ側にプラグインの実行処理を実装

import { Component } from "@angular/core";
import { Platform } from "@ionic/angular";

declare var HelloWorld: any;

@Component({
  selector: "app-home",
  templateUrl: "home.page.html",
  styleUrls: ["home.page.scss"],
})
export class HomePage {
  constructor(public platform: Platform) {
    this.platform.ready().then(() => {
      HelloWorld.echo("MyName", this.successCallback, this.errorCallback);
    });
  }
  successCallback(message) {
    alert(message);
  }
  errorCallback() {
    alert("hello error");
  }
}

Platform の追加と実行

$ ionic cordova platform add android
$ ionic cordova platform add ios
$ ionic cordova run android
$ ionic cordova run ios

Ionic native plugin の作成

準備

$ git clone https://github.com/ionic-team/ionic-native.git
$ rm -rf ionic-native/src/@ionic-native/plugins/*

Native Plugin 用のファイルの生成

$ cd ionic-native
$ npm install
$ gulp plugin:create -n HelloWorldPlugin

プラグインの定義部分を変更:

@Plugin({
  pluginName: 'HelloWorldPlugin',
  plugin: 'cordova-plugin-helloworld',
  pluginRef: 'HelloWorldPlugin',
  platforms: ['Android', 'iOS'],
})

メソッドを追加:

@Injectable()
export class HelloWorldPlugin extends IonicNativePlugin {
  @Cordova()
  echo(arg1: string): Promise<any> {
    return;
  }
}

Native Plugin のビルド

$ npm run build

Native Plugin のインストール

$ npm install --save path/to/ionic-native/dist/\@ionic-native/hello-world-plugin

呼び出しコードを修正

import { Component } from "@angular/core";
import { Platform } from "@ionic/angular";
import { HelloWorldPlugin } from "@ionic-native/hello-world-plugin/ngx";

@Component({
  selector: "app-home",
  templateUrl: "home.page.html",
  styleUrls: ["home.page.scss"],
})
export class HomePage {
  constructor(public platform: Platform, public helloworld: HelloWorldPlugin) {
    this.platform.ready().then(() => {
      this.helloworld.echo("ACN").then((message) => {
        this.successCallback(message);
      });
    });
  }
  successCallback(message) {
    alert(message);
  }
  errorCallback() {
    alert("hello error");
  }
}

Git

ここにコード置いてます

参考