capacitor-plugin-development について
Capacitorプラグインを作成、保守する開発者向けのスキルです。プロジェクトの生成からAPI設計、Web・iOS・Android実装、テスト、ドキュメント作成、公開までを案内します。
主な機能
- 01プラグインプロジェクトの生成
- 02TypeScriptプラグインAPIの設計
- 03Web・iOS・Android層の実装
- 04クロスプラットフォームのイベントと権限
- 05検証、文書化、公開
活用シーン
- 01Capacitorプラグインを新規作成
- 02既存プラグインへのメソッドやプラットフォーム実装の追加
- 03プラグインを検証してnpm公開を準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ capawesome-team/ skills --skill capacitor-plugin-developmentインストール後、Claude Code で/capacitor-plugin-developmentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/android-guide.mddesigning-api.mdios-guide.mdplugin-configuration.mdpublishing.mdscaffolding.mdtesting-and-workflow.mdweb-guide.md詳細
Capacitor プラグイン開発
Capacitor プラグインの作成と保守を行います。スキャフォールディング、ネイティブ API のブリッジ(iOS/Android)、型定義、テスト、公開に対応します。
前提条件
| 要件 | バージョン |
|---|---|
| Node.js | LTS(18+) |
| npm | 6+ |
| Xcode | 15+(iOS 用) |
| Android Studio | Hedgehog 2023.1.1+(Android 用) |
| Capacitor | 6+ |
エージェントの動作
- 質問する前に自動検出します。
package.jsonを読み込み、ディレクトリ構造を調べ、ユーザーに尋ねる前にプラグインの現在の状態を推測します。 - 手順を追って案内します。 一度に1つのフェーズを進めます。関連のない複数のタスクを同時に提示しないでください。
- 既存の作業は省略します。 プラグインのスキャフォールディングがすでに済んでいる場合は省略します。iOS 実装がすでにある場合は、次のプラットフォームに進みます。
- 対象プラットフォームを確認します。 ユーザーが指定しない場合は、3つすべて(iOS、Android、Web)を実装します。
手順
ステップ 1:タスクを確認する
ユーザーが何をしたいのかを尋ねます。よくあるタスクは次のとおりです。
- 新しいプラグインを一から作成する — ステップ 2 に進みます。
- 既存のプラグインに新しいメソッドを追加する — ステップ 5 に進みます。
- 新しいプラットフォーム実装を追加する — 該当するプラットフォームのステップ(ステップ 6、7、または 8)に進みます。
- プラグイン設定を行う —
references/plugin-configuration.mdを読み込み、適用します。 - プラグインフックを設定する —
references/testing-and-workflow.mdの「Plugin Hooks」セクションを読み込み、適用します。 - プラグインを公開する — ステップ 10 に進みます。
ユーザーの意図が文脈から明らかな場合は、この質問を省略して直接進みます。
ステップ 2:プラグインをスキャフォールドする
references/scaffolding.md を読み込み、Capacitor プラグインジェネレーターを使用して新しいプラグインプロジェクトを生成する手順を案内します。
次の情報をユーザーから収集します(または文脈から推測します)。
- プラグインの npm パッケージ名
- Android パッケージ ID
- プラグインのクラス名
- リポジトリ URL
- ライセンス
- 説明
ジェネレーターを実行し、npm run verify でスキャフォールディングを検証します。
ステップ 3:TypeScript API を設計する
references/designing-api.md を読み込み、プラグインインターフェイスの定義を案内します。
- プラグインが公開するメソッドと、各メソッドが受け取るデータおよび返すデータをユーザーに尋ねます。
src/definitions.tsでプラグインインターフェイスと、サポートするすべての型を定義します。registerPlugin()を使用して、src/index.tsにプラグインを登録します。
次の点を確認してください。
- すべてのメソッドとプロパティに、
@sinceタグを含む JSDoc コメントが付いていること。 - オプションと結果の型が、個別のインターフェイスとして定義されていること。
- TypeScript の enum ではなく、文字列のユニオン型を使用していること。
ステップ 4:Web レイヤーを実装する
references/web-guide.md を読み込み、src/web.ts に Web レイヤーを実装します。
WebPluginを継承し、プラグインインターフェイスを実装します。- Web API を使用するメソッドでは、ブラウザー上のロジックを実装します。
- Web での同等機能がないメソッドでは、
this.unimplemented()をスローします。 - すべてのブラウザーで利用できるとは限らない Web API が必要なメソッドでは、その API の存在を確認し、利用できない場合は
this.unavailable()をスローします。
実装後、ビルドして検証します。
npm run build
npm run verify:web
ステップ 5:プラットフォーム間でメソッドのシグネチャを定義する
ネイティブコードを実装する前に、各プラグインメソッドの型を決定します。
| 型 | TypeScript | iOS | Android |
|---|---|---|---|
| 値を返す | Promise<T> | CAPPluginReturnPromise | @PluginMethod() |
| void を返す | Promise<void> | CAPPluginReturnNone | @PluginMethod(returnType = PluginMethod.RETURN_NONE) |
| コールバック(繰り返し) | Promise<string> | CAPPluginReturnCallback | @PluginMethod(returnType = PluginMethod.RETURN_CALLBACK) |
ほとんどのメソッドでは「値を返す」型を使用します。「コールバック」は、継続的なデータストリーム(位置情報の監視など)に限って使用します。
Step 6: iOS プラグインを実装する
references/ios-guide.md を読み、iOS レイヤーを実装します。
- プラットフォームロジックを含む実装クラス(例:
ios/Sources/<ClassName>Plugin/Example.swift)を作成または更新します。NSObjectを継承し、メソッドに@objcを付けます。 - プラグインクラス(例:
ios/Sources/<ClassName>Plugin/ExamplePlugin.swift)を作成または更新します。CAPPluginを継承し、CAPBridgedPluginに準拠させます。identifier、jsName、pluginMethodsプロパティを設定します。- 各
@objc funcメソッドを実装し、CAPPluginCallからデータを読み取り、resolve()、reject()、unavailable()、またはunimplemented()を呼び出します。
- プラグインにサードパーティ製の iOS 依存関係が必要な場合は、
.podspecファイルに追加します。 - プラグインに権限が必要な場合は、
checkPermissions()とrequestPermissions()を実装し、必要なInfo.plistキーをドキュメントに記載します。
実装後、次のコマンドで検証します。
npm run verify:ios
Step 7: Android プラグインを実装する
references/android-guide.md を読み、Android レイヤーを実装します。
- プラットフォームロジックを含む実装クラス(例:
android/src/main/java/<package-path>/Example.java)を作成または更新します。 - プラグインクラス(例:
android/src/main/java/<package-path>/ExamplePlugin.java)を作成または更新します。Pluginを継承し、@CapacitorPlugin(name = "<JSName>")を追加します。- 各
@PluginMethodメソッドを実装し、PluginCallからデータを読み取り、resolve()、reject()、unavailable()、またはunimplemented()を呼び出します。
- プラグインにサードパーティ製の Android 依存関係が必要な場合は、
android/build.gradleに追加します。 - プラグインに権限が必要な場合:
@CapacitorPluginアノテーションで権限エイリアスを定義します。checkPermissions()とrequestPermissions()を実装します。- アプリ開発者が
AndroidManifest.xmlに追加する必要がある権限をドキュメントに記載します。
実装後、次のコマンドで検証します。
npm run verify:android
Step 8: イベントを追加する(必要な場合)
プラグインが JavaScript にイベントを送信する場合:
- TypeScript:
src/definitions.tsのプラグインインターフェースにaddListener()とremoveAllListeners()メソッドを追加します。イベントの種類ごとにイベントインターフェースを定義します。 - Web:イベントが発生したときに
this.notifyListeners('eventName', data)を呼び出します。 - iOS:イベントが発生したときに
self.notifyListeners("eventName", data: [...])を呼び出します。システム通知をリッスンする場合は、load()でオブザーバーを登録します。 - Android:イベントが発生したときに
notifyListeners("eventName", jsObject)を呼び出します。必要に応じてhandleOnConfigurationChanged()をオーバーライドするか、ブロードキャストレシーバーを登録します。
イベント名の文字列がすべてのプラットフォームで同一であり、addListener() の eventName パラメーターと一致することを確認します。
Step 9: ドキュメントを生成して検証する
src/definitions.tsのすべてのメソッドとインターフェースに、まだ追加されていない場合は JSDoc コメントを追加します。- ドキュメントを生成します。
npm run docgen
- 全項目を検証します。
npm run verify
- リントとフォーマットを実行します。
npm run lint
npm run fmt
Step 10: 公開する
references/publishing.md を読み、公開プロセスをユーザーに案内します。
package.jsonのフィールド(name、version、description、files、capacitor)が正しいことを確認します。- 公開前チェックリストを実行します。
- npm に公開します。
npm publish --access public
エラー処理
npm init @capacitor/plugin@latestが失敗する場合:Node.js LTS と npm 6 以降がインストールされていることを確認してください。node -vとnpm -vを実行して確認します。npm run verify:iosが「module not found」で失敗する場合:cd ios && pod install --repo-update && cd ..を実行して、CocoaPods の依存関係をインストールしてください。npm run verify:androidがビルドエラーで失敗する場合:Android Studio でandroid/を開き、Gradle を同期して、不足している依存関係や SDK バージョンの不一致がないか確認してください。npm run buildが TypeScript エラーで失敗する場合:src/definitions.tsに型の不一致がないか確認してください。src/web.tsのウェブ実装がプラグインインターフェースを正しく実装していることを確認してください。registerPlugin()の名前が一致しない場合:src/index.tsのregisterPlugin()に渡す最初の引数は、iOS のjsNameプロパティおよび Android の@CapacitorPlugin(name = "...")の値と完全に一致している必要があります。一致しないと、プラグインが読み込まれません。- iOS:メソッドを JavaScript から呼び出せない場合:すべてのプラグインメソッドに
@objcが付いており、CAPBridgedPluginのpluginMethods配列に記載されていることを確認してください。 - Android:メソッドを JavaScript から呼び出せない場合:すべてのプラグインメソッドに
@PluginMethod()アノテーションが付いており、publicであることを確認してください。 - JavaScript でイベントを受信できない場合:ネイティブの
notifyListeners()呼び出しと TypeScript のaddListener()定義で、イベント名の文字列が完全に一致していることを確認してください。イベントが発生する前にaddListener()が呼び出されていることも確認してください。 - プラグイン設定値を読み取れない場合:
getConfig().getString("key")のキー名が、Capacitor の設定ファイルのplugins.<PluginJSName>にあるキーと一致していることを確認してください。 npm run docgenの出力が空になる場合:実装クラスではなく、src/definitions.tsのプラグインインターフェースメソッドに JSDoc コメントがあることを確認してください。
関連スキル
capacitor-plugin-spm-support— Capacitor プラグインに Swift Package Manager のサポートを追加します。capacitor-plugin-upgrades— Capacitor プラグインを新しい Capacitor メジャーバージョンにアップグレードします。capacitor-plugins— アプリプロジェクトに既存の Capacitor プラグインをインストールして設定します。