在您的插件中将 Capacitor 更新到 3.0
对于正在更新到 Capacitor 3 的插件,有几个必需和推荐的更改。
规划核心 API
目前,核心团队很难在不潜在影响插件的情况下对 Capacitor 的内部结构进行更改。由于 Capacitor 2 中大多数类和方法对 iOS 和 Android 都是公开的,我们观察到用户对我们视为内部使用的 Capacitor API 进行了不当使用。
在 Capacitor 3 的开发过程中,我们将评估这个问题并创建一个官方的公开 API 供插件使用,该 API 将 在此处记录。
Android
使用新的 @CapacitorPlugin 注解
@NativePlugin 注解已被弃用。我们现在建议使用新的 @CapacitorPlugin 注解,它将支持 新的权限 API。
name 属性保持不变。requestCodes 和 permissionRequestCode 属性已被移除。permissions 属性需要替换为 @Permission 注解列表,每个注解包含一组清单字符串及其对应的 alias,在新的权限 API 在您的插件中实现之前,您可以暂时省略 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 并移除了手动定义的请求码。插件不再需要提供请求码并重写 handleOnActivityResult 或 handleRequestPermissionsResult,而是应该使用 @ActivityCallback 或 @PermissionCallback 注解提供回调方法。这些回调可以在启动新的 Activity 或权限请求时引用。
-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("Activity canceled");
+ } else {
+ Intent data = result.getData();
+ // 对结果数据进行处理
+ call.resolve("Success!");
+ }
+}
使用 WebColor.parseColor() 替代 Color.parseColor()
Android 将带 alpha 通道的十六进制颜色字符串解析为 ARGB,而在 iOS 和 Web 中则解析为 RGBA。如果您在跨平台共享带 alpha 通道的颜色,请务必使用新的 WebColor 工具类。WebColor.parseColor() 的工作方式类似于原生 Android 的 Color.parseColor() 函数,但将字符串解析为 RGBA 格式。
String colorStringWithAlpha = "#FF000088"; // 半透明红色
int color = WebColor.parseColor(colorStringWithAlpha);
如果您的颜色没有 alpha 通道,两个函数将返回相同的结果。
更改默认的 compileSdkVersion 和 targetSdkVersion 为 30
在 android/build.gradle 中将 compileSdkVersion 和 targetSdkVersion 的默认值更改为 30。
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 中更新了对象之间的关系以修复内存泄漏。其结果是,插件对层次结构中较高层对象的引用现在为 weak,在 Swift 中这意味着它们是可选的 。您最可能在访问 bridge 时遇到此更改,但它也适用于其他属性,如 webView。对桥接器方法的调用相对不变,只是现在需要使用可选链:
-bridge.presentVC(myViewController, animated: true, completion: nil)
+bridge?.presentVC(myViewController, animated: true, completion: nil)
此更改的最大影响是桥接器的所有返回值也将是可选的。安全处理和展开可选值可能需要额外步骤