Ionic原生插件 #

一、插件概述 #

1.1 插件结构 #

text
capacitor-plugin/
├── src/
│   ├── definitions.ts      # TypeScript接口定义
│   ├── index.ts            # 插件入口
│   └── web.ts              # Web实现
├── android/
│   └── src/main/java/com/example/plugin/
│       └── MyPlugin.java   # Android实现
├── ios/
│   └── Plugin/
│       ├── MyPlugin.swift  # iOS实现
│       └── MyPlugin.m      # Objective-C桥接
├── package.json
├── README.md
└── capacitor.config.json

1.2 插件类型 #

类型 说明
官方插件 Capacitor团队维护
社区插件 社区开发者贡献
自定义插件 项目特定需求

二、创建插件 #

2.1 使用CLI创建 #

bash
npm init @capacitor/plugin
npx cap plugin:generate

2.2 手动创建 #

bash
mkdir my-plugin
cd my-plugin
npm init -y

2.3 TypeScript定义 #

typescript
// src/definitions.ts
export interface MyPlugin {
  echo(options: { value: string }): Promise<{ value: string }>;
  getDeviceInfo(): Promise<DeviceInfo>;
}

export interface DeviceInfo {
  model: string;
  platform: string;
  osVersion: string;
}
typescript
// src/index.ts
import { registerPlugin } from '@capacitor/core';
import type { MyPlugin } from './definitions';

const MyPlugin = registerPlugin<MyPlugin>('MyPlugin', {
  web: () => import('./web').then(m => new m.MyPluginWeb()),
});

export * from './definitions';
export { MyPlugin };

2.4 Web实现 #

typescript
// src/web.ts
import { WebPlugin } from '@capacitor/core';
import { MyPlugin, DeviceInfo } from './definitions';

export class MyPluginWeb extends WebPlugin implements MyPlugin {
  async echo(options: { value: string }): Promise<{ value: string }> {
    return { value: options.value };
  }
  
  async getDeviceInfo(): Promise<DeviceInfo> {
    return {
      model: 'Web Browser',
      platform: 'web',
      osVersion: navigator.userAgent
    };
  }
}

三、Android实现 #

3.1 插件类 #

java
// android/src/main/java/com/example/plugin/MyPlugin.java
package com.example.plugin;

import com.getcapacitor.JSObject;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;
import com.getcapacitor.annotation.CapacitorPlugin;

@CapacitorPlugin(name = "MyPlugin")
public class MyPlugin extends Plugin {
    
    @PluginMethod
    public void echo(PluginCall call) {
        String value = call.getString("value");
        
        JSObject ret = new JSObject();
        ret.put("value", value);
        
        call.resolve(ret);
    }
    
    @PluginMethod
    public void getDeviceInfo(PluginCall call) {
        JSObject ret = new JSObject();
        ret.put("model", android.os.Build.MODEL);
        ret.put("platform", "android");
        ret.put("osVersion", android.os.Build.VERSION.RELEASE);
        
        call.resolve(ret);
    }
}

3.2 AndroidManifest.xml #

xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

3.3 build.gradle #

gradle
apply plugin: 'com.android.library'

android {
    compileSdkVersion 33
    
    defaultConfig {
        minSdkVersion 22
        targetSdkVersion 33
    }
}

dependencies {
    implementation 'com.capacitorjs:core:5.0.0'
}

四、iOS实现 #

4.1 Swift实现 #

swift
// ios/Plugin/MyPlugin.swift
import Foundation
import Capacitor

@objc(MyPlugin)
public class MyPlugin: CAPPlugin {
    
    @objc func echo(_ call: CAPPluginCall) {
        guard let value = call.getString("value") else {
            call.reject("Value is required")
            return
        }
        
        call.resolve([
            "value": value
        ])
    }
    
    @objc func getDeviceInfo(_ call: CAPPluginCall) {
        let device = UIDevice.current
        
        call.resolve([
            "model": device.model,
            "platform": "ios",
            "osVersion": device.systemVersion
        ])
    }
}

4.2 Objective-C桥接 #

objective-c
// ios/Plugin/MyPlugin.m
#import <Capacitor/Capacitor.h>

CAP_PLUGIN(MyPlugin, "MyPlugin",
    CAP_PLUGIN_METHOD(echo, CAPPluginReturnPromise);
    CAP_PLUGIN_METHOD(getDeviceInfo, CAPPluginReturnPromise);
)

4.3 Podspec #

ruby
# MyPlugin.podspec
Pod::Spec.new do |s|
  s.name = 'MyPlugin'
  s.version = '1.0.0'
  s.summary = 'My Capacitor Plugin'
  s.homepage = 'https://github.com/example/my-plugin'
  s.author = 'Your Name'
  s.source = { :git => 'https://github.com/example/my-plugin.git', :tag => s.version.to_s }
  s.source_files = 'ios/Plugin/**/*.{swift,m,h}'
  s.swift_version = '5.1'
  s.dependency 'Capacitor'
end

五、使用插件 #

5.1 安装插件 #

bash
npm install my-plugin
npx cap sync

5.2 在应用中使用 #

typescript
import { MyPlugin } from 'my-plugin';

// 调用方法
async echo() {
  const result = await MyPlugin.echo({ value: 'Hello' });
  console.log(result.value);
}

async getDeviceInfo() {
  const info = await MyPlugin.getDeviceInfo();
  console.log(info);
}

六、插件配置 #

6.1 package.json #

json
{
  "name": "my-plugin",
  "version": "1.0.0",
  "description": "My Capacitor Plugin",
  "main": "dist/plugin.cjs.js",
  "module": "dist/esm/index.js",
  "types": "dist/esm/index.d.ts",
  "files": [
    "dist/",
    "android/",
    "ios/"
  ],
  "capacitor": {
    "ios": {
      "src": "ios"
    },
    "android": {
      "src": "android"
    }
  },
  "keywords": [
    "capacitor",
    "plugin",
    "native"
  ],
  "peerDependencies": {
    "@capacitor/core": "^5.0.0"
  }
}

6.2 capacitor.config.json #

json
{
  "appId": "com.example.plugin",
  "appName": "My Plugin",
  "webDir": "dist",
  "plugins": {
    "MyPlugin": {
      "option1": "value1"
    }
  }
}

七、发布插件 #

7.1 构建插件 #

bash
npm run build

7.2 发布到npm #

bash
npm login
npm publish

7.3 更新文档 #

markdown
# My Plugin

## Installation

```bash
npm install my-plugin
npx cap sync

Usage #

typescript
import { MyPlugin } from 'my-plugin';

const result = await MyPlugin.echo({ value: 'Hello' });

API #

echo(options) #

Param Type Description
value string The value to echo

Returns: Promise<{ value: string }>

getDeviceInfo() #

Returns: Promise<DeviceInfo>

text

## 八、最佳实践

### 8.1 错误处理

```typescript
@PluginMethod
public void myMethod(PluginCall call) {
    try {
        // 执行操作
        JSObject ret = new JSObject();
        ret.put("result", "success");
        call.resolve(ret);
    } catch (Exception e) {
        call.reject("操作失败: " + e.getMessage());
    }
}

8.2 权限处理 #

java
@PluginMethod
public void requirePermission(PluginCall call) {
    if (getPermissionState("camera") != PermissionState.GRANTED) {
        requestPermission(call, "camera");
    } else {
        // 执行操作
    }
}

8.3 事件通知 #

typescript
// 触发事件
notifyListeners('myEvent', {
  data: 'event data'
});

// 监听事件
MyPlugin.addListener('myEvent', (data) => {
  console.log('收到事件:', data);
});

九、总结 #

9.1 插件开发要点 #

要点 说明
接口定义 TypeScript类型
Web实现 WebPlugin基类
Android实现 Plugin基类
iOS实现 CAPPlugin基类
发布 npm发布

9.2 下一步 #

掌握了原生插件开发后,接下来让我们学习 性能优化,了解Ionic的性能优化技巧!

最后更新:2026-03-28