JavaScriptによるiOS、Android、およびWeb用アプリケーションの開発を目的とした、Ionicの新しいネイティブAPIコンテナのCapacitorが、 バージョン1.0に到達した。ネイティブ機能にアクセスするクロスプラットフォームアプリケーションの開発において、新たな方法を試みるものだ。
Cordovaと同じように、Capacitorの目標は、プラットフォーム固有のコードを記述することなく、アプリケーションの基盤となるOSのネイティブ機能にアクセスできるようにすることだ。これが実現すれば、iOS、Android、Electronの各アプリで、例えばデバイスのカメラを同じコードで使用できるようになる。ただしCapacitorでは、アプリで使用可能なネイティブ機能を統一インターフェース経由で公開し、HTML/CSS/JavaScriptアプリをコンテナ化してネイティブなWebビューで実行するという、まったく異なるアプローチを採用している。
Cordovaとの大きな違いのひとつは、通常とは逆に、開発するネイティブアプリケーションプロジェクト(Ionicアプリケーションが実行されるWebビューを含む)を、Capacitorのコンポーネントとして扱うように要求している点だ。このアプローチにより、iOS上においてAppDelegateの調整を必要とするような外部SDKとの統合が容易になると同時に、ネイティブ機能のIonicアプリへの統合が、Cordovaの場合のように特別なプラグインを記述しなくても可能になった。
Capacitorのもうひとつのメリットは、devicereadyイベントをリスンする必要がない点だ。Ionicアプリがロードされる前に、Capacitorがすべてのプラグインをロードすることによって、これが可能になっている。さらに、Capacitorプラグインが呼び出し可能なメソッドを公開しているため、 exec
を使用する必要もない。例として下記に示したのは、iOS用の非常に単純なCapacitorプラグインで、CAPPlugin
を拡張したSwiftクラスだ。
import Capacitor
@objc(MyPlugin)
public class MyPlugin: CAPPlugin {
@objc func echo(_ call: CAPPluginCall) {
let value = call.getString("value") ?? ""
call.resolve([
"value": value
])
}
}
プラグインのecho
メソッドをCapacitor Webランタイムから直接利用できるようにするには、それを.m
ファイルに登録する必要がある。
#import <Capacitor/Capacitor.h>
CAP_PLUGIN(MyPlugin, "MyPlugin",
CAP_PLUGIN_METHOD(echo, CAPPluginReturnPromise);
)
Capacitorでは、プラグインやプラットフォームなどの依存関係の管理にnpmを使用している。そのため、プラグインを使用する必要がある場合は、通常どおりJavaScriptプロジェクトに対してnpm install
を実行するだけでよい。Cordovaではこれと違い、 ”cordova plugin add ...
”コマンドを使用する必要がある。さらなる単純化の例として、Capacitorでは、iOSプラグインのネイティブコンポーネントをCocoaPodにして、Android用のスタンドアロンライブラリとしてパッケージ化するように求めている。
最後に注意すべき点として、最終的にはCapacitorがCordovaに取って代わり、Ionicアプリをコンテナ化して、ネイティブ機能にクロスプラットフォームでアクセスできるようにするが、Cordovaについても今後、長くサポートが行われる予定である。