从 Capacitor 3 升级到 Capacitor 4
与之前的升级相比,Capacitor 3 和 4 之间的破坏性变更相当少。在本指南中,你将找到将项目更新到当前 Capacitor 4 版本的步骤,以及官方插件的破坏性变更列表。
使用 CLI 进行迁移
使用 npm i -D @capacitor/cli@latest-4 将最新版本的 Capacitor CLI 安装到你的项目中。安装完成后,只需运行 npx cap migrate,CLI 将为你处理迁移。如果迁移的某些步骤无法完成,终端输出中会提供额外的信息。以下是手动迁移的步骤。
iOS
以下指南描述了如何将你的 Capacitor 3 iOS 项目升级到 Capacitor 4。
提升 iOS 部署目标
在你的 Xcode 项目中执行以下操作:在项目编辑器中选择 Project,然后打开 Build Settings 选项卡。在 Deployment 部分,将 iOS Deployment Target 更改为 iOS 13.0。对所有应用 Targets 重复相同步骤。
然后,打开 ios/App/Podfile 并按照以下步骤操作:
- 在第一行添加:
require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers'
- 将 iOS 版本更新为 13.0:
platform : ios, '13.0'
- 在最后一行添加以下代码块:
post_install do |installer|
assertDeploymentTarget(installer)
end
移除不必要的代码
从 AppDelegate.swift 中移除未使用的 touchesBegan 方法:
-override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
- super.touchesBegan(touches, with: event)
-
- let statusBarRect = UIApplication.shared.statusBarFrame
- guard let touchPoint = event?.allTouches?.first?.location(in: self.window) else { return }
-
- if statusBarRect.contains(touchPoint) {
- NotificationCenter.default.post(name: .capacitorStatusBarTapped, object: nil)
- }
-}
可选:从 Info.plist 中移除 NSAppTransportSecurity 条目
NSAppTransportSecurity 仅用于 live reload,如果你不使用 live reload 或者你使用 Ionic CLI 进行 live reload,则不再需要此条目。
-<key>NSAppTransportSecurity</key>
-<dict>
- <key>NSAllowsArbitraryLoads</key>
- <true/>
-</dict>
Android
以下指南描述了如何将你的 Capacitor 3 Android 项目升级到 Capacitor 4。
更新 Android 项目变量
在你的 variables.gradle 文件中,将值更新为以下新的最低版本,并添加新的 coreSplashScreenVersion 和 androidxWebkitVersion:
minSdkVersion = 22
compileSdkVersion = 32
targetSdkVersion = 32
androidxActivityVersion = '1.4.0'
androidxAppCompatVersion = '1.4.2'
androidxCoordinatorLayoutVersion = '1.2.0'
androidxCoreVersion = '1.8.0'
androidxFragmentVersion = '1.4.1'
coreSplashScreenVersion = '1.0.0-rc01'
androidxWebkitVersion = '1.4.0'
junitVersion = '4.13.2'
androidxJunitVersion = '1.1.3'
androidxEspressoCoreVersion = '3.4.0'
cordovaAndroidVersion = '10.1.1'
在 Android Manifest 中添加 android:exported 标签
在你的 AndroidManifest.xml 文件中,需要在 <activity> 标签中添加以下行:
android:exported="true"
此标签确保你可以打开应用中的这个 "Activity"(即屏幕)。有关此标签及其他标签的更多信息,请查看 Android 的 <activity> 参考文档。
默认情况下,你的 AndroidManifest.xml 位于 android/app/src/main/AndroidManifest.xml。
更新 Gradle Google Services 插件
在 android/build.gradle 文件中,将 classpath 'com.google.gms:google-services:4.3.5' 改为 classpath 'com.google.gms:google-services:4.3.13' 以更新 Google Services 插件。
更新至 Gradle 7
在 File > Project Structure > Project 中调整你的 Gradle 项目设置。Android Gradle Plugin Version 应为 7.2.1 或更高版本,Gradle Version 应为 7.4.2 或更高版本。应用这些更改后,点击 Android Studio 右上角的大象图标运行 gradle 同步。
Android Studio 可能会提供自动迁移到 Gradle 7 的功能。请接受这个提议!前往你的 build.gradle 文件,点击 💡 图标,然后点击 "Upgrade Gradle"。项目迁移完成后,按上述说明运行 gradle 同步。
另一个替代方案是使用 Android Gradle Plugin Upgrade Assistant 来处理迁移。此工具的步骤可以在 Android 文档中找到。
确保你使用的是 Java 11
Capacitor 3 同时支持 Java 8 和 Java 11。今后,Capacitor 4 将只支持 Java 11。你可以通过在 Android Studio 中进入以下菜单来更改项目设置:
Preferences > Build, Execution, Deployment > Build Tools > Gradle

在那里,你可以将 "Gradle JDK" 修改为 Java 11。
Java 11 随最新版本的 Android Studio 一起提供。无 需额外下载!
切换到自动 Android 插件加载
这是 Capacitor 3 中的可选更改,但对于 Capacitor 4 升级现在是强制性的,因为 init 方法已被移除。在 MainActivity.java 中,可以移除 onCreate 方法。在添加或移除通过 npm 安装的插件时,你不再需要编辑此文件。
public class MainActivity extends BridgeActivity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // 初始化 Bridge
- this.init(savedInstanceState, new ArrayList<Class<? extends Plugin>>() {{
- // 你安装的额外插件放在这里
- add(Plugin1.class);
- add(Plugin2.class);
- }});
- }
}
更改 registerPlugin 的顺序
如果你的应用包含专门为你的应用程序构建的自定义插件,你必须在 super.onCreate 之前注册它们:
public class MainActivity extends BridgeActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
+ registerPlugin(PluginInMyApp.class);
super.onCreate(savedInstanceState);
- registerPlugin(PluginInMyApp.class);
}
}
可选:使用新的 Android 12 启动画面 API
要启用新的推荐的 Android 12 启动画面 API,需要进行以下更改:
- 在
android/app/src/main/res/values/styles.xml中,将AppTheme.NoActionBarLaunch主题的parent属性从AppTheme.NoActionBar改为Theme.SplashScreen,并为主题添加所需选项。
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
<item name="android:background">@drawable/splash</item>
</style>
不启用 Android 12 启动画面将导致 Android 12+ 设备上出现双重启动画面,并在旧设备上使用旧的启动画面。
此项更改是可选的,但建议执行,以防止 Android Studio 在之前的更改后显示 Cannot resolve symbol 'Theme.SplashScreen' 消息。
- 在
android/app/build.gradle的 dependencies 部分添加implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"。
可选:使用 DayNight 主题
要享受基于用户设备主题的自动主题切换(暗色/亮色主题),在 android/app/src/main/res/values/styles.xml 中将 <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar"> 改为 <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">。
可选:从 Gradle 文件中移除 jcenter()
在之前的 Capacitor 版本中,由于我们的 Cordova 兼容层托管在 Jcenter 上,因此需要 jcenter()。但是,我们现在使用最新的 Cordova Android 版本,托管在 Maven Central 上。因此,你可以从你的 build.gradle 文件中完全移除 jcenter()。在移除之前,请确保你正在使用的其他插件或原生依赖没有托管在 Jcenter 上!
插件
以下插件功能已被修改或移除。请相应更新你的代码。
Storage
@capacitor/storage 插件已重命名为 @capacitor/preferences,以更好地反映其用途。API 保持不变。
Camera
preserveAspectRatio设置已被移除。- 该插件将不再警告缺少 iOS 使用说明。
androidxMaterialVersion变量已更新为1.6.1。androidxExifInterfaceVersion变量已更新为1.3.3。
Action Sheet
ShowActionsOptions.title现在是可选的。androidxMaterialVersion变量已更新为1.6.1。
仅限 iOS
buildActionSheet的 title 和 message 现在可选。
Push Notifications
- 为
registrationError事件添加了新类型RegistrationError。 importance现在是可选的。默认为3。deleteChannel现在只接受频道 ID,而不是整个对象。firebaseMessagingVersion变量已更新为23.0.5。- Android 现在遵循
presentationOptions配置选项。
Local Notifications
importance现在是可选的。默认为3。deleteChannel现在只接受频道 ID,而不是整个对象。- Android 12+ 需要权限