将插件升级至Capacitor 3.0
以下是插件升级到Capacitor 3所需的核心变更和建议调整。
核心API规划
当前核心团队在修改Capacitor内部实现时,可能影响插件功能。由于Capacitor 2中iOS和Android的大部分类与方法都是公开的,我们注意到部分内部API被不当使用。
在Capacitor 3开发过程中,我们将评估这一问题并建立官方公共API,相关文档将发布于此处。
Android平台适配
使用新版@CapacitorPlugin
注解
@NativePlugin
注解已弃用,推荐使用新@CapacitorPlugin
注解以支持全新权限API。
主要变更点:
name
属性保持不变- 移除
requestCodes
和permissionRequestCode
属性 permissions
属性替换为@Permission
注解列表(可暂不设置alias
)
-@NativePlugin(
+@CapacitorPlugin(
name = "FooBar",
- requestCodes = {
- FooBarPlugin.REQUEST_SOME_METHOD,
- FooBarPlugin.REQUEST_SOME_OTHER_METHOD
- },
- permissionRequestCode = FooBarPlugin.REQUEST_ALL_PERMISSIONS,
- permissions = { Manifest.permission.FOO, Manifest.permission.BAR }
+ permissions = {
+ @Permission(strings = { Manifest.permission.FOO }, alias = "foo"),
+ @Permission(strings = { Manifest.permission.BAR }, alias = "bar")
+ })
)
public class FooBarPlugin extends Plugin {
static final int REQUEST_SOME_METHOD = 10051;
static final int REQUEST_SOME_OTHER_METHOD = 10052;
Android请求码变更
Capacitor 3.0采用AndroidX Activity Result API,移除了手动定义请求码的方式。现在应该使用@ActivityCallback
或@PermissionCallback
注解声明回调方法。
-static final int IMAGE_REQUEST = 10052;
@PluginMethod
public void chooseImage(PluginCall call) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
- startActivityForResult(call, intent, IMAGE_REQUEST);
+ startActivityForResult(call, intent, "chooseImageResult");
}
+@ActivityCallback
+private void chooseImageResult(PluginCall call, ActivityResult result) {
+ if (result.getResultCode() == Activity.RESULT_CANCELED) {
+ call.reject("用户取消操作");
+ } else {
+ Intent data = result.getData();
+ // 处理返回数据
+ call.resolve("操作成功");
+ }
+}
使用WebColor.parseColor()替代Color.parseColor()
Android解析带透明通道的十六进制颜色时为_ARGB_格式,而iOS和Web端使用_RGBA_格式。跨平台共享颜色时请使用新版WebColor
工具类。
String colorStringWithAlpha = "#FF000088"; // 半透明红色
int color = WebColor.parseColor(colorStringWithAlpha);
若颜色不包含透明通道,两个方法返回值相同。
调整默认SDK版本
在android/build.gradle
中更新默认值:
android {
- compileSdkVersion project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 29
+ compileSdkVersion project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 30
defaultConfig {
minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 21
- targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 29
+ targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 30
}
}
iOS平台适配
弱引用改造
Capacitor 3中对象关系调整为弱引用(Swift中表现为可选类型),主要影响:
- 访问
bridge
等高层级对象时需使用可选链 - 所有桥接返回值都变为可选类型
推荐处理方式:
if bridge?.isSimEnvironment == true {
// 显式比较方式
}
if let isSim = bridge?.isSimEnvironment, isSim {
// 更安全的可选绑定方式
}
桥接API变更
桥接接口已正式协议化,多数属性/方法已重命名(旧接口暂时保留但会标记为废弃)。Xcode通常能自动提示新名称:
CAPPluginCall参数处理
参数便捷方法更新要点:
- 移除
get()
方法,可直接访问options
字典 - 弃用
hasOption
,推荐使用类型化访问器 - 带默认值的访问器现在要求非可选默认值
- 日期和null值处理行为微调(详见)
- Objective-C辅助方法需单独导入:
#import <Capacitor/CAPBridgedJSTypes.h>
PluginCall & CAPPluginCall变更
采用resolve()/reject()
推荐使用resolve()
和reject()
替代已弃用的success()
/error()
,更符合Promise规范。
无参resolve()现在返回undefined
此前返回空对象的行为已调整为与JavaScript的Promise.resolve()
一致。
调用保持机制
弃用save()
方法,新增keepAlive
属性。详见调用保持规范。
设置iOS最低版本为12.0
需三处调整:
- Xcode项目中设置Deployment Target为iOS 12.0
- 更新Podfile:
-platform :ios, '11.0'
+platform :ios, '12.0'
- 修改podspec文件:
-s.ios.deployment_target = '11.0'
+s.ios.deployment_target = '12.0'
Swift版本升级至5
- Xcode中设置Swift Language Version为Swift 5
- 更新podspec:
-s.swift_version = '4.2'
+s.swift_version = '5.1'
Web端调整
插件注册新规范
弃用registerWebPlugin(MyPlugin)
,推荐使用新版惰性加载方式:
const MyCoolPlugin = registerPlugin<CoolPlugin>('MyCoolPlugin', {
web: () => import('./web').then((m) => new m.MyCoolPluginWeb()),
// electron: () => ("./electron").then(m => new m.MyCoolPluginElectron())
});
设置TypeScript输出目标
建议在tsconfig.json
中将target设为es2017
。
错误处理优化
推荐使用新版错误码:
- Unavailable:功能当前不可用
- Unimplemented:功能未实现/不计划实现
各平台错误处理指南: