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