跳到主要内容
版本:v8

从 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 并按照以下步骤操作:

  1. 在第一行添加:
require_relative '/main/node_modules/@capacitor/ios/scripts/pods_helpers'
  1. 将 iOS 版本更新到 13.0:
platform :ios, '13.0'
  1. 在最后一行添加此块:
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 仅用于实时重新加载,如果您不使用实时重新加载或使用 Ionic CLI 进行实时重新加载,则不再需要此条目。

-<key>NSAppTransportSecurity</key>
-<dict>
- <key>NSAllowsArbitraryLoads</key>
- <true/>
-</dict>

Android

以下指南介绍了如何将 Capacitor 3 Android 项目升级到 Capacitor 4。

更新 Android 项目变量

在您的 variables.gradle 文件中,将值更新为以下新的最小值并添加新的 coreSplashScreenVersionandroidxWebkitVersion

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:exported 标签添加到您的 Android Manifest

在您的 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 preferences

从那里,您可以将 "Gradle JDK" 修改为 Java 11。

信息

最新版本的 Android Studio 附带 Java 11。无需额外下载!

切换到自动 Android 插件加载

这是 Capacitor 3 中的一个可选更改,但由于 init 方法已被删除,因此对于 Capacitor 4 升级现在是强制性的。在 MainActivity.java 中,可以删除 onCreate 方法。在添加或删除通过 npm 安装的插件时,您不再需要编辑此文件。

 public class MainActivity extends BridgeActivity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Initializes the Bridge
- this.init(savedInstanceState, new ArrayList<Class<? extends Plugin>>() {{
- // Additional plugins you've installed go here
- 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 Splash Screen API

要启用新的推荐的 Android 12 Splash Screen 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 Splash Screen 将导致在 Android 12+ 设备上出现双启动画面,并在旧设备上使用旧的启动画面。

此更改是可选的,但建议这样做,以防止 Android Studio 在上述更改后显示 Cannot resolve symbol 'Theme.SplashScreen' 消息。

  • android/app/build.gradle 的 dependencies 部分添加 implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"

可选:使用 DayNight 主题

为了根据用户的设备主题自动更改主题(深色/浅色主题),请将 <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar"> 更改为 <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">android/app/src/main/res/values/styles.xml 中。

可选:从 Gradle 文件中删除 jcenter()

在以前的 Capacitor 版本中,由于我们的 Cordova 兼容性层托管在 Jcenter 上,因此需要 jcenter()。但是,我们现在使用最新的 Cordova Android 版本,托管在 Maven Central 上。这样,您可能可以从 build.gradle 文件中完全删除 jcenter()。如果您使用其他插件或原生依赖项,请在删除之前确保它们没有托管在 Jcenter 上!

Plugins

以下插件功能已被修改或删除。相应地更新您的代码。

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 标题和消息现在是可选的。

Push Notifications

  • 添加了新类型 RegistrationError,用于 registrationError 事件。
  • importance 现在是可选的。默认为 3
  • deleteChannel 现在仅接受通道 ID 而不是整个对象。
  • firebaseMessagingVersion 变量已更新到 23.0.5
  • Android 现在遵守 presentationOptions 配置选项。

Local Notifications

  • importance 现在是可选的。默认为 3
  • deleteChannel 现在仅接受通道 ID 而不是整个对象。
  • Android 12+ 需要权限才能进行精确通知。

App

  • App.exitApp() 现在返回一个 promise。

Geolocation

  • getCurrentPosition() 现在忽略超时。
  • playServicesLocationVersion 已更新到 20.0.0
  • 插件现在在应用进入后台状态时停止位置更新。
  • 如果系统位置服务被禁用,插件现在会抛出错误。

FileSystem

  • copy 现在返回复制文件的路径。
  • ReaddirResult 现在返回 FileInfo 对象数组,其中包含除 URI 之外的与每个文件相关的元数据。
  • StatResult 已统一,在所有平台上返回相同的结果。

Device

  • model 现在在 iOS 上返回确切的型号(从 "iPhone" 到 "iPhone13.4")。
  • getLanguageCode() 现在在 Web 上返回短语言代码(与其他平台一样),要获取完整代码,请使用 getLanguageTag()

Dialog

  • title 现在是可选的。

Keyboard

  • style 配置选项现在使用 KeyboardStyle 枚举作为选项。

Toast

  • 在 Android 12 和更新版本上,所有提示都在底部显示。

Browser

  • androidxBrowserVersion 变量已更新到 1.4.0

Splash Screen

  • 如果切换到新的 Android 12 Splash Screen API,大多数配置选项将不适用于初始启动画面,但在调用 show() 时它们仍可用于启动画面。此外,在 Android 12+ 设备上,初始启动画面与 show() 方法显示的启动画面不同。