关于 capacitor-plugin-upgrade-v8-to-v9
这项技能指导将 Capacitor 插件项目从 8 版迁移到 9 版,涵盖依赖范围、原生 API 移除、构建文件、Cordova 可选支持及示例应用验证。
主要功能
- 01插件迁移前检查
- 02自动迁移工具
- 03更新 Android 与 iOS API
- 04CocoaPods 和 SPM 构建文件
- 05调整 Cordova 依赖
- 06示例应用与发布验证
适用场景
- 01为插件添加 Capacitor 9 支持
- 02解决原生编译失败
- 03准备插件变更并发布
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cap-go/ capgo-skills --skill capacitor-plugin-upgrade-v8-to-v9安装后在 Claude Code 中输入/capacitor-plugin-upgrade-v8-to-v9确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
metadata.jsonreferences/android-api-removals.mdbuild-files.mdios-api-removals.mdverification.md详细介绍
Capacitor 插件从 v8 升级到 v9
Capacitor 9 目前为预发布版本(截至 2026 年 10 月,next dist-tag,版本为 9.0.0-alpha.x)。下方的依赖范围面向预发布版本;9.0.0 GA 发布后,请使用 ^9.0.0 / from: "9.0.0"。如果稳定版插件仅支持预发布版核心,请在发布前告知用户;一种常见做法是使用 npm next 标签发布。
规范来源:https://capacitorjs.com/docs/updating/plugins/9-0
适用场景
在以下情况触发:
- 插件仓库中的
peerDependencies["@capacitor/core"]为^8或>=8,且用户希望支持 Capacitor 9 - 插件因使用已移除的 API(
CAPBridge、@NativePlugin、saveCall、getWebView()、isSimulator())而无法针对 Capacitor 9 编译 - 插件的
android/build.gradle在 AGP 9 / Gradle 9 下构建失败(jcenter()、kotlin-android、proguard-android.txt、命名空间冲突) - 未使用 Cordova 插件的使用方应用在插件的 Cordova SPM 产品或
com.getcapacitor.cordova导入处失败
请勿用于:
- 应用项目 ->
capacitor-app-upgrade-v8-to-v9 - 插件仍处于 v7 或更早版本 ->
capacitor-plugin-upgrades(按主版本逐级升级) - 为仅支持 CocoaPods 的插件添加 SPM ->
capacitor-plugin-spm-support - 仅针对 8.5 UIScene 生命周期检查插件 ->
capacitor-uiscene-migration(references/plugin-audit.md)
当前项目快照
!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=['package.name='+(pkg.name||''),'package.version='+(pkg.version||'')];for(const section of ['peerDependencies','dependencies','devDependencies']){for(const [name,version] of Object.entries(pkg[section]||{})){if(name.startsWith('@capacitor/'))out.push(section+'.'+name+'='+version)}}out.push('Package.swift='+fs.existsSync('Package.swift'));out.push('podspec='+fs.readdirSync('.').filter(f=>f.endsWith('.podspec')).join(','));console.log(out.join('\n'))"
!find . -maxdepth 3 \( -path './example-app' -o -path './example' -o -path './ios' -o -path './android' \) -not -path './node_modules/*'
流程
- 检查。 阅读快照、
android/build.gradle、android/gradle.properties、.podspec、Package.swift,并列出原生源码(android/src/main、ios/Sources或ios/Plugin)。记下示例应用的路径。确认工作树干净(git status)。 - 运行迁移工具,位置为插件根目录:
检查差异(npx @capacitor/plugin-migration-v8-to-v9@latestgit diff)。它涵盖了大部分文件修改,但不包括代码中的 API 移除。 - 依赖项(位于
package.json):devDependencies:将@capacitor/cli、@capacitor/core、@capacitor/android、@capacitor/ios升级到next。peerDependencies["@capacitor/core"]:设为>=9.0.0-alpha.6(运行npm view @capacitor/core dist-tags查看当前预发布版本)。询问此版本是否仍应支持 8;大多数插件会移除对它的支持,因为 iOS 16 / AGP 9 的构建变更不向后兼容。
- 构建文件:参照
references/build-files.md(gradle.properties、build.gradle、podspec、Package.swift)。保留 podspec 和Package.swift:使用 CocoaPods 和 SPM 的应用都会使用该插件。 - 代码 API 移除。 搜索后,参照
references/android-api-removals.md和references/ios-api-removals.md修复每一处命中。不要将已弃用的调用路径留在#if或反射代码后面。 - Cordova 可选性。 从
Package.swift中移除无条件的.product(name: "Cordova", ...)。如果插件的原生代码导入了 Cordova 兼容类(com.getcapacitor.cordova.*、CDV*),在没有 Cordova 插件的应用中就会出错;请询问用户应如何替换它。 - UIScene 生命周期。 每个 Capacitor 9 应用都基于场景。检查 iOS 代码是否依赖 AppDelegate 方法、
tmpWindow、通过keyWindow展示内容、applicationState(参见capacitor-uiscene-migration->references/plugin-audit.md)。现在最低版本为 9,可以安全使用.capacitorScene*通知和SceneDelegateProxy。 - 示例应用和文档。 使用
capacitor-app-upgrade-v8-to-v9升级示例应用。更新 README 安装说明和兼容性表(Capacitor 9、iOS 16、minSdk 26)。 - 验证:参照
references/verification.md。将插件主版本号加 1。
陷阱
- AGP 9 默认启用
android.uniquePackageNames=true:脚手架默认命名空间(com.mycompany.plugins.example)或沿用上游命名空间的分支会导致使用该插件的应用构建失败。请设置唯一的命名空间。 - 库模块中的
targetSdkVersion不会影响运行时;应将其删除,而不是升级。 CapacitorUrlRequest.setRequestHeaders([String: Any])会设置值,而不是追加;现在重复的标头键会相互覆盖。Package.swift中必须将capacitor-swift-pm指向from: "9.0.0-alpha.6"或更高版本(更早的 alpha 版本在 Cordova 可选性方面会导致崩溃)。使用最新的 alpha 版本。googleMapsUtilsVersion5.0.0 包含上游破坏性 API 变更。- 在插件根目录运行
npx cap sync没有用;应在示例应用中运行 sync。
错误处理
| 错误 | 修复方法 |
|---|---|
cannot find symbol ... class NativePlugin | @CapacitorPlugin(name = ..., permissions = ...) |
cannot find symbol ... method saveCall(PluginCall) | call.setKeepAlive(true) 或 bridge.saveCall(call) |
cannot find symbol ... method pluginRequestPermission(...) | requestPermissionForAlias(alias, call, "callbackName") + @PermissionCallback |
Cannot find 'CAPBridge' in scope | ApplicationDelegateProxy.shared / Notification.Name.capacitorStatusBarTapped |
Value of type 'CAPBridgeProtocol' has no member 'getWebView' | bridge?.webView(其他 getter 也采用相同模式 -> 属性) |
| AGP 9 下出现 Kotlin 插件重复或冲突错误 | 移除独立的 Kotlin 插件和 stdlib |
| 使用该插件的应用中出现命名空间冲突 / 包重复 | 在 android/build.gradle 中设置唯一的 namespace |
使用该插件的应用中出现提及 Cordova 的 SPM 解析或链接错误 | 移除 Cordova 产品依赖 |
参考资料
仅在涉及相应主题时加载参考资料。
| 文件 | 加载时机 |
|---|---|
references/build-files.md | 编辑 gradle.properties、build.gradle、podspec、Package.swift 或 wrapper 时 |
references/android-api-removals.md | 出现任何 Java/Kotlin 编译错误或 grep 命中时 |
references/ios-api-removals.md | 出现任何 Swift/ObjC 编译错误或 grep 命中时 |
references/verification.md | 编辑后:执行 grep、构建、示例应用检查和发布时 |
相关技能:capacitor-plugin-upgrades、capacitor-app-upgrade-v8-to-v9、capacitor-uiscene-migration、capacitor-plugin-spm-support。