问题修复
Capacitor 应用崩溃…
当 Capacitor 应用出现崩溃、WebView/JavaScript 或原生代码异常、网络请求失败、权限被拒、白屏、深链失效等行为时,按平台使用对应调试工具定位问题。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Capacitor 应用崩溃、WebVi通用
解决思路
- WebView 调试(iOS):在设备上开启 Settings > Safari > Advanced > Web Inspector 和 JavaScript;在 capacitor.config.ts 中设置 ios.webContentsDebuggingEnabled: true(iOS 16.4+ 必需);在 Mac 上打开 Safari,Develop 菜单 > [设备名] > [应用名](若无 Develop 菜单,在 Safari > Settings > Advanced 中勾选 Show Develop menu);用 Console 看 JS 日志、Network 看 API 调用、Elements 看 DOM、Sources 设断点。
- WebView 调试(Android):在 capacitor.config.ts 中设置 android.webContentsDebuggingEnabled: true;在电脑 Chrome 打开 chrome://inspect,设备/模拟器出现后点击应用下的 inspect;用 Console 看 JS 日志、Network 看 API 请求、Performance 做性能分析、Application 看存储与 cookie。
- VS Code 远程调试:安装 Debugger for Chrome 扩展,在 .vscode/launch.json 中配置 type: chrome、request: attach、port: 9222、webRoot: ${workspaceFolder}/dist,附加到 Android WebView。
- 原生调试(iOS):用 npx cap open ios 打开 Xcode;在 Swift/Obj-C 文件行号处点击设断点,或在 LLDB 用 breakpoint set --name methodName;Product > Run(Cmd + R)带调试器运行;LLDB 命令用 po myVariable、p myObject、continue、next、step、bt;在 Window > Devices and Simulators 选择设备 > View Device Logs 查看崩溃日志。
- 原生调试(Android):用 npx cap open android 打开 Android Studio;Run > Attach Debugger to Android Process 选择应用;在 Java/Kotlin 文件行号处设断点;调试控制台可求值 myVariable、执行 myObject.toString();在 View > Tool Windows > Logcat 中按 package:com.yourapp 过滤日志。
- JavaScript 日志:使用 console.log/warn/error、console.group/groupEnd 分组、console.table 表格、console.time/timeEnd 计时。
- iOS 原生日志:使用 os.log 的 Logger(subsystem:category:),按 debug/info/warning/error 级别记录,可带数据插值;也可用 NSLog 输出到 Console.app。
- Android 原生日志:使用 android.util.Log 的 Log.v/d/i/w/e,可传入 exception 记录异常。
- 启动崩溃诊断:iOS 用 xcrun simctl spawn booted log stream --level debug | grep -i crash;Android 用 adb logcat *:E | grep -i "fatal\|crash";常见原因包括插件未注册、capacitor.config 无效、缺少原生依赖;检查清单:运行 npx cap sync、iOS 执行 cd ios/App && pod install、检查 Info.plist 权限、检查 AndroidManifest.xml 权限。
- 插件方法未找到(Error: "MyPlugin" plugin is not implemented on ios/android)诊断:用 Capacitor.Plugins 检查插件是否存在;解决:npm install @capgo/plugin-name 安装插件、npx cap sync 同步、确认原生代码中插件已注册。
- 网络请求失败诊断:包装 window.fetch 打印请求 URL、响应状态与错误;常见原因与修复:iOS ATS 阻止 HTTP 时在 Info.plist 加 NSAppTransportSecurity/NSAllowsArbitraryLoads;Android 明文被阻止时在 capacitor.config.ts 的 server.cleartext: true(仅开发用);CORS 问题改用 CapacitorHttp.request 发原生请求。
- 权限被拒诊断:用 Permissions.query({ name: 'camera' }) 查看状态;iOS 在 Info.plist 添加 NSCameraUsageDescription 等用途说明;Android 在 AndroidManifest.xml 添加 uses-permission。
- 白屏诊断:检查 WebView 控制台错误、确认 dist/ 目录存在、核对 capacitor.config.ts 的 webDir;解决:npm run build 重建、npx cap sync 同步、cat capacitor.config.ts 检查配置。
- 深链失效诊断:用 App.addListener('appUrlOpen', ...) 打印 event.url;iOS 检查 Associated Domains entitlement 与 apple-app-site-association 文件;Android 检查 AndroidManifest.xml 的 intent filters。
- JavaScript 性能调试:用 performance.mark/measure 测量操作耗时,再用 performance.getEntriesByName 读取 duration。
- iOS 性能调试:Product > Profile(Cmd + I),选择 Time Profiler(CPU)、Allocations(内存)、Network(网络)模板。
- Android 性能调试:View > Tool Windows > Profiler,选择 CPU(方法追踪)、Memory(堆分析)、Network(请求时间线)。
- JavaScript 内存泄漏:用 Chrome DevTools Memory 面板,先拍堆快照、执行操作、再拍快照、对比两次快照。
- iOS 内存调试:用 xcrun instruments -t Leaks -D output.trace YourApp.app 运行 Leaks 工具。
- Android 内存调试:在 build.gradle 添加 debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12' 使用 LeakCanary。
- 通用调试检查清单:检查 WebView 控制台、检查原生日志、确认插件已安装并同步、检查权限、在真机(非仅模拟器)测试、尝试干净构建(rm -rf node_modules && npm install)、核对 capacitor.config.ts、检查 capacitor 包版本是否匹配。