用途
本技能用于把 Capacitor 6 应用迁移到 Capacitor 7。权威依据为 https://capacitorjs.com/docs/updating/7-0。
何时使用
- package.json 快照中 @capacitor/core 为 6.x,且用户希望升级到 7.x。
- 升级到 7 后构建失败,出现 JDK 21 / AGP 8.7 错误、iOS 部署目标 13 错误,或已移除的废弃插件类型导致的 TypeScript 错误。
- 用户要求确切的 6 -> 7 检查清单。
不适用场景
- 应用在 5.x:先使用 capacitor-app-upgrade-v5-to-v6。
- 应用在 7.x:使用 capacitor-app-upgrade-v7-to-v8。
- 多跳升级规划:使用 capacitor-app-upgrades。
- 插件库升级:使用 capacitor-plugin-upgrade-v6-to-v7。
- CocoaPods 转 SPM:使用 cocoapods-to-spm。
项目快照
从 package.json 读取当前 Capacitor 包版本,命令如下:
node -e "const fs=require('fs');if(!fs.existsSync('package.json'))process.exit(0);const pkg=JSON.parse(fs.readFileSync('package.json','utf8'));const out=[];for(const section of ['dependencies','devDependencies']){for(const [name,version] of Object.entries(pkg[section]||{})){if(name.startsWith('@capacitor/'))out.push(section+'.'+name+'='+version)}}console.log(out.sort().join('\n'))"
参考资料
仅在相关主题出现时加载对应参考文件:
- references/android.md:手动编辑 variables.gradle、build.gradle、wrapper、manifest 或 Kotlin 时加载。
- references/plugins.md:应用使用官方 @capacitor/* 插件(App、Device、Haptics、Splash Screen、Status Bar 等)时加载。
预检要求
Capacitor 7 的最低工具要求:
- Node.js:20+(建议最新 LTS)
- Xcode:16.0+
- iOS 部署目标:14.0
- Android Studio:Ladybug 2024.2.1+(自带 JDK 21)
- Java(Gradle JDK):21
- AGP / Gradle:8.7.2 / 8.11.1
- Android SDK:minSdk 23、compileSdk 35、targetSdk 35
预检命令:
node -v && xcodebuild -version && java -version
git status --short
grep -rn "bundledWebRuntime\|staticPlugins" capacitor.config.*
操作步骤
-
从快照确认当前为 6.x。注意:将 minSdk 降至 23、iOS 降至 14 会移除对旧设备的支持,需告知用户。
-
运行自动迁移:
npm i -D @capacitor/cli@latest-7
npx cap migrate
该命令会升级包版本、将 iOS 部署目标和 Podfile 提升到 14.0、更新 Gradle 文件与 wrapper,并运行 cap sync。完成它报告为跳过或失败的每一步。
- 配置(capacitor.config.*):
- bundledWebRuntime 已移除。若为 false,直接删除;若为 true,应用必须使用打包器(Vite、webpack 等)打包 @capacitor/core,而不是加载 capacitor.js。
- cordova.staticPlugins 已移除。需要静态链接的 Cordova 插件必须使用带 use-framework 的 podspec 标签(cordova-ios 7+ 不支持 framework 标签)。
-
iOS:在 Build Settings 中将 Project 及每个 Target 的 iOS Deployment Target 设为 14.0,并在 ios/App/Podfile 中设置 platform :ios, '14.0'。对于 SPM 应用,检查 CapApp-SPM/Package.swift 的 platforms。
-
Android:应用 references/android.md(AGP 8.7.2、Gradle 8.11.1、google-services 4.4.2、Kotlin 1.9.25,configChanges 中可选的 navigation)。
-
将 @capacitor/* 插件更新到 ^7.0.0,社区插件更新到其 Capacitor 7 版本。按 references/plugins.md 修复已移除的类型。
-
遥测对新 CLI 用户为选择退出,且从不在 CI 中运行。如需禁用,运行 npx cap telemetry off。
-
运行验证。
常见陷阱
- 必须使用 JDK 21:Capacitor 7 的 Android 模块以 Java 21 源/目标编译,JDK 17 的 Gradle 运行时会报 invalid source release: 21。应修复 Gradle JDK(IDE 和 CI),而非代码。
- 仍声明 minSdkVersion 22 或 iOS 13 的社区插件可以编译,但声明 @capacitor/core peer ^6 的插件会导致 npm ERESOLVE。应升级或替换它们;除非用户接受风险,否则避免 --legacy-peer-deps。
- Device getInfo() 不再返回 diskFree、diskTotal、realDiskFree、realDiskTotal。仅在没有其他代码读取磁盘空间时,才移除对应的 PrivacyInfo.xcprivacy 磁盘空间条目。
验证
grep -rn "bundledWebRuntime\|staticPlugins" capacitor.config.* # expect none
grep -rn "IPHONEOS_DEPLOYMENT_TARGET" ios/App/App.xcodeproj/project.pbxproj | sort -u # 14.0
grep -n "platform :ios" ios/App/Podfile 2>/dev/null # '14.0'
grep -n "gradle:8.7.2\|google-services:4.4.2" android/build.gradle
grep -n "distributionUrl" android/gradle/wrapper/gradle-wrapper.properties # gradle-8.11.1
grep -n "SdkVersion" android/variables.gradle # 23 / 35 / 35
grep -rnE "AppUrlOpen|AppRestoredResult|DeviceBatteryInfo|DeviceLanguageCodeResult|Haptics(Impact|Notification)(Options|Type|Style)|SplashScreen(Show|Hide)Options|diskFree|diskTotal" src/
npx cap sync
cd android && ./gradlew assembleDebug
然后在 Xcode 16+ 中构建 iOS 并启动两个平台。
错误处理
- 报错 "Migrate can only be used on Capacitor 6, please use the CLI in Capacitor 6 to upgrade to 6 first":先运行 capacitor-app-upgrade-v5-to-v6。
- 报错 "Capacitor 7 requires JDK 21 or higher. Some steps may fail." 或 "invalid source release: 21":将 Gradle JDK 设为 21(Android Studio Ladybug 自带),并在 CI 中同样设置。
- 报错 "Skipped updating deployment target":在 Xcode 和 Podfile 中手动设置 iOS 14.0(步骤 4)。
- 报错 "Unable to find "<text>" in <file>. Try updating it manually":应用 references/android.md 中的 diff。
- 报错 "Module '"@capacitor/app"' has no exported member 'AppUrlOpen'"(或类似):按 references/plugins.md 重命名为替代类型。
- 报错 "ERESOLVE unable to resolve dependency tree on @capacitor/core":某插件仍 peer 在 v6;将其升级到 v7 版本。