debugging-capacitor
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDebugging Capacitor Applications
Capacitor应用调试指南
Complete guide to debugging Capacitor apps on iOS and Android.
iOS和Android平台Capacitor应用完整调试指南。
When to Use This Skill
何时使用本技能
- User reports app crashes
- User needs to debug WebView/JavaScript
- User needs to debug native code
- User has network/API issues
- User sees unexpected behavior
- User asks how to debug
- 用户报告应用崩溃
- 用户需要调试WebView/JavaScript
- 用户需要调试原生代码
- 用户遇到网络/API问题
- 用户发现异常行为
- 用户询问调试方法
Quick Reference: Debugging Tools
快速参考:调试工具
| Platform | WebView Debug | Native Debug | Logs |
|---|---|---|---|
| iOS | Safari Web Inspector | Xcode Debugger | Console.app |
| Android | Chrome DevTools | Android Studio | adb logcat |
| 平台 | WebView调试 | 原生调试 | 日志工具 |
|---|---|---|---|
| iOS | Safari Web Inspector | Xcode Debugger | Console.app |
| Android | Chrome DevTools | Android Studio | adb logcat |
WebView Debugging
WebView调试
iOS: Safari Web Inspector
iOS:Safari Web Inspector
-
Enable on device:
- Settings > Safari > Advanced > Web Inspector: ON
- Settings > Safari > Advanced > JavaScript: ON
-
Enable in Xcode (capacitor.config.ts):
typescript
const config: CapacitorConfig = {
ios: {
webContentsDebuggingEnabled: true, // Required for iOS 16.4+
},
};-
Connect Safari:
- Open Safari on Mac
- Develop menu > [Device Name] > [App Name]
- If no Develop menu: Safari > Settings > Advanced > Show Develop menu
-
Debug:
- Console: View JavaScript logs
- Network: Inspect API calls
- Elements: Inspect DOM
- Sources: Set breakpoints
-
在设备上启用:
- 设置 > Safari > 高级 > Web检查器:开启
- 设置 > Safari > 高级 > JavaScript:开启
-
在Xcode中启用(capacitor.config.ts):
typescript
const config: CapacitorConfig = {
ios: {
webContentsDebuggingEnabled: true, // Required for iOS 16.4+
},
};-
连接Safari:
- 在Mac上打开Safari
- 开发菜单 > [设备名称] > [应用名称]
- 若无开发菜单:Safari > 设置 > 高级 > 显示开发菜单
-
调试操作:
- 控制台:查看JavaScript日志
- 网络:检查API调用
- 元素:检查DOM
- 源代码:设置断点
Android: Chrome DevTools
Android:Chrome DevTools
- Enable in config (capacitor.config.ts):
typescript
const config: CapacitorConfig = {
android: {
webContentsDebuggingEnabled: true,
},
};-
Connect Chrome:
- Open Chrome on computer
- Navigate to
chrome://inspect - Your device/emulator should appear
- Click "inspect" under your app
-
Debug features:
- Console: JavaScript logs
- Network: API requests
- Performance: Profiling
- Application: Storage, cookies
- 在配置中启用(capacitor.config.ts):
typescript
const config: CapacitorConfig = {
android: {
webContentsDebuggingEnabled: true,
},
};-
连接Chrome:
- 在电脑上打开Chrome
- 导航至
chrome://inspect - 你的设备/模拟器会显示在此处
- 点击应用下方的「inspect」
-
调试功能:
- 控制台:JavaScript日志
- 网络:API请求
- 性能:性能分析
- 应用:存储、Cookie
Remote Debugging with VS Code
使用VS Code进行远程调试
Install "Debugger for Chrome" extension:
json
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "attach",
"name": "Attach to Android WebView",
"port": 9222,
"webRoot": "${workspaceFolder}/dist"
}
]
}安装「Debugger for Chrome」扩展:
json
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "attach",
"name": "Attach to Android WebView",
"port": 9222,
"webRoot": "${workspaceFolder}/dist"
}
]
}Native Debugging
原生调试
iOS: Xcode Debugger
iOS:Xcode Debugger
- Open in Xcode:
bash
bunx cap open ios-
Set breakpoints:
- Click line number in Swift/Obj-C files
- Or use in LLDB
breakpoint set --name methodName
-
Run with debugger:
- Product > Run (Cmd + R)
- Or click Play button
-
LLDB Console commands:
lldb
undefined- 在Xcode中打开:
bash
bunx cap open ios-
设置断点:
- 点击Swift/Obj-C文件的行号
- 或在LLDB中使用
breakpoint set --name methodName
-
使用调试器运行:
- 产品 > 运行(Cmd + R)
- 或点击播放按钮
-
LLDB控制台命令:
lldb
undefinedPrint variable
Print variable
po myVariable
po myVariable
Print object description
Print object description
p myObject
p myObject
Continue execution
Continue execution
continue
continue
Step over
Step over
next
next
Step into
Step into
step
step
Print backtrace
Print backtrace
bt
5. **View crash logs**:
- Window > Devices and Simulators
- Select device > View Device Logsbt
5. **查看崩溃日志**:
- 窗口 > 设备和模拟器
- 选择设备 > 查看设备日志Android: Android Studio Debugger
Android:Android Studio Debugger
- Open in Android Studio:
bash
bunx cap open android-
Attach debugger:
- Run > Attach Debugger to Android Process
- Select your app
-
Set breakpoints:
- Click line number in Java/Kotlin files
-
Debug console:
undefined- 在Android Studio中打开:
bash
bunx cap open android-
附加调试器:
- 运行 > 附加调试器到Android进程
- 选择你的应用
-
设置断点:
- 点击Java/Kotlin文件的行号
-
调试控制台:
undefinedEvaluate expression
Evaluate expression
myVariable
myVariable
Run method
Run method
myObject.toString()
5. **Logcat shortcuts**:
- View > Tool Windows > Logcat
- Filter by package: `package:com.yourapp`myObject.toString()
5. **Logcat快捷操作**:
- 视图 > 工具窗口 > Logcat
- 按包名过滤:`package:com.yourapp`Console Logging
控制台日志
JavaScript Side
JavaScript端
typescript
// Basic logging
console.log('Debug info:', data);
console.warn('Warning:', issue);
console.error('Error:', error);
// Grouped logs
console.group('API Call');
console.log('URL:', url);
console.log('Response:', response);
console.groupEnd();
// Table format
console.table(arrayOfObjects);
// Timing
console.time('operation');
// ... operation
console.timeEnd('operation');typescript
// Basic logging
console.log('Debug info:', data);
console.warn('Warning:', issue);
console.error('Error:', error);
// Grouped logs
console.group('API Call');
console.log('URL:', url);
console.log('Response:', response);
console.groupEnd();
// Table format
console.table(arrayOfObjects);
// Timing
console.time('operation');
// ... operation
console.timeEnd('operation');Native Side (iOS)
iOS原生端
swift
import os.log
let logger = Logger(subsystem: "com.yourapp", category: "MyPlugin")
// Log levels
logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")
// With data
logger.info("User ID: \(userId)")
// Legacy NSLog (shows in Console.app)
NSLog("Legacy log: %@", message)swift
import os.log
let logger = Logger(subsystem: "com.yourapp", category: "MyPlugin")
// Log levels
logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")
// With data
logger.info("User ID: \(userId)")
// Legacy NSLog (shows in Console.app)
NSLog("Legacy log: %@", message)Native Side (Android)
Android原生端
kotlin
import android.util.Log
// Log levels
Log.v("MyPlugin", "Verbose message")
Log.d("MyPlugin", "Debug message")
Log.i("MyPlugin", "Info message")
Log.w("MyPlugin", "Warning message")
Log.e("MyPlugin", "Error message")
// With exception
Log.e("MyPlugin", "Error occurred", exception)kotlin
import android.util.Log
// Log levels
Log.v("MyPlugin", "Verbose message")
Log.d("MyPlugin", "Debug message")
Log.i("MyPlugin", "Info message")
Log.w("MyPlugin", "Warning message")
Log.e("MyPlugin", "Error message")
// With exception
Log.e("MyPlugin", "Error occurred", exception)Common Issues and Solutions
常见问题及解决方案
Issue: App Crashes on Startup
问题:应用启动时崩溃
Diagnosis:
bash
undefined诊断:
bash
undefinediOS - Check crash logs
iOS - 检查崩溃日志
xcrun simctl spawn booted log stream --level debug | grep -i crash
xcrun simctl spawn booted log stream --level debug | grep -i crash
Android - Check logcat
Android - 检查logcat
adb logcat *:E | grep -i "fatal|crash"
**Common causes**:
1. Missing plugin registration
2. Invalid capacitor.config
3. Missing native dependencies
**Solution checklist**:
- [ ] Run `bunx cap sync`
- [ ] iOS: `cd ios/App && pod install`
- [ ] Check Info.plist permissions
- [ ] Check AndroidManifest.xml permissionsadb logcat *:E | grep -i "fatal|crash"
**常见原因**:
1. 缺少插件注册
2. capacitor.config配置无效
3. 缺少原生依赖
**解决方案清单**:
- [ ] 运行 `bunx cap sync`
- [ ] iOS: `cd ios/App && pod install`
- [ ] 检查Info.plist权限配置
- [ ] 检查AndroidManifest.xml权限配置Issue: Plugin Method Not Found
问题:未找到插件方法
Error:
Error: "MyPlugin" plugin is not implemented on ios/androidDiagnosis:
typescript
import { Capacitor } from '@capacitor/core';
// Check if plugin exists
console.log('Plugins:', Capacitor.Plugins);
console.log('MyPlugin available:', !!Capacitor.Plugins.MyPlugin);Solutions:
- Ensure plugin is installed:
bun add @capgo/plugin-name - Run sync:
bunx cap sync - Check plugin is registered (native code)
错误信息:
Error: "MyPlugin" plugin is not implemented on ios/android诊断:
typescript
import { Capacitor } from '@capacitor/core';
// Check if plugin exists
console.log('Plugins:', Capacitor.Plugins);
console.log('MyPlugin available:', !!Capacitor.Plugins.MyPlugin);解决方案:
- 确保已安装插件:
bun add @capgo/plugin-name - 执行同步:
bunx cap sync - 检查插件是否已注册(原生代码中)
Issue: Network Requests Failing
问题:网络请求失败
Diagnosis:
typescript
// Add request interceptor
const originalFetch = window.fetch;
window.fetch = async (...args) => {
console.log('Fetch:', args[0]);
try {
const response = await originalFetch(...args);
console.log('Response status:', response.status);
return response;
} catch (error) {
console.error('Fetch error:', error);
throw error;
}
};Common causes:
- iOS ATS blocking HTTP: Add to Info.plist:
xml
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>- Android cleartext blocked: Add to capacitor.config.ts:
typescript
server: {
cleartext: true, // Only for development!
}- CORS issues: Use native HTTP:
typescript
import { CapacitorHttp } from '@capacitor/core';
const response = await CapacitorHttp.request({
method: 'GET',
url: 'https://api.example.com/data',
});诊断:
typescript
// Add request interceptor
const originalFetch = window.fetch;
window.fetch = async (...args) => {
console.log('Fetch:', args[0]);
try {
const response = await originalFetch(...args);
console.log('Response status:', response.status);
return response;
} catch (error) {
console.error('Fetch error:', error);
throw error;
}
};常见原因:
- iOS ATS拦截HTTP请求: 在Info.plist中添加:
xml
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>- Android明文请求被阻止: 在capacitor.config.ts中添加:
typescript
server: {
cleartext: true, // Only for development!
}- CORS问题: 使用原生HTTP请求:
typescript
import { CapacitorHttp } from '@capacitor/core';
const response = await CapacitorHttp.request({
method: 'GET',
url: 'https://api.example.com/data',
});Issue: Permission Denied
问题:权限被拒绝
Diagnosis:
typescript
import { Permissions } from '@capacitor/core';
// Check permission status
const status = await Permissions.query({ name: 'camera' });
console.log('Camera permission:', status.state);iOS: Check Info.plist has usage descriptions:
xml
<key>NSCameraUsageDescription</key>
<string>We need camera access to scan documents</string>Android: Check AndroidManifest.xml:
xml
<uses-permission android:name="android.permission.CAMERA" />诊断:
typescript
import { Permissions } from '@capacitor/core';
// Check permission status
const status = await Permissions.query({ name: 'camera' });
console.log('Camera permission:', status.state);iOS: 检查Info.plist是否包含使用说明:
xml
<key>NSCameraUsageDescription</key>
<string>We need camera access to scan documents</string>Android: 检查AndroidManifest.xml:
xml
<uses-permission android:name="android.permission.CAMERA" />Issue: White Screen on Launch
问题:启动时显示白屏
Diagnosis:
- Check WebView console for errors (Safari/Chrome)
- Check if folder exists
dist/ - Verify in capacitor.config.ts
webDir
Solutions:
bash
undefined诊断:
- 检查WebView控制台错误(Safari/Chrome)
- 检查文件夹是否存在
dist/ - 验证capacitor.config.ts中的配置
webDir
解决方案:
bash
undefinedRebuild web assets
Rebuild web assets
bun run build
bun run build
Sync to native
Sync to native
bunx cap sync
bunx cap sync
Check config
Check config
cat capacitor.config.ts
undefinedcat capacitor.config.ts
undefinedIssue: Deep Links Not Working
问题:深度链接无法工作
Diagnosis:
typescript
import { App } from '@capacitor/app';
App.addListener('appUrlOpen', (event) => {
console.log('Deep link:', event.url);
});iOS: Check Associated Domains entitlement and apple-app-site-association file.
Android: Check intent filters in AndroidManifest.xml.
诊断:
typescript
import { App } from '@capacitor/app';
App.addListener('appUrlOpen', (event) => {
console.log('Deep link:', event.url);
});iOS: 检查关联域名权限和apple-app-site-association文件。
Android: 检查AndroidManifest.xml中的意图过滤器。
Performance Debugging
性能调试
JavaScript Performance
JavaScript性能
typescript
// Mark performance
performance.mark('start');
// ... operation
performance.mark('end');
performance.measure('operation', 'start', 'end');
const measures = performance.getEntriesByName('operation');
console.log('Duration:', measures[0].duration);typescript
// Mark performance
performance.mark('start');
// ... operation
performance.mark('end');
performance.measure('operation', 'start', 'end');
const measures = performance.getEntriesByName('operation');
console.log('Duration:', measures[0].duration);iOS Performance (Instruments)
iOS性能调试(Instruments)
- Product > Profile (Cmd + I)
- Choose template:
- Time Profiler: CPU usage
- Allocations: Memory usage
- Network: Network activity
- 产品 > 性能分析(Cmd + I)
- 选择模板:
- Time Profiler:CPU使用率
- Allocations:内存使用率
- Network:网络活动
Android Performance (Profiler)
Android性能调试(Profiler)
- View > Tool Windows > Profiler
- Select:
- CPU: Method tracing
- Memory: Heap analysis
- Network: Request timeline
- 视图 > 工具窗口 > Profiler
- 选择:
- CPU:方法追踪
- Memory:堆分析
- Network:请求时间线
Memory Debugging
内存调试
JavaScript Memory Leaks
JavaScript内存泄漏
Use Chrome DevTools Memory tab:
- Take heap snapshot
- Perform action
- Take another snapshot
- Compare snapshots
使用Chrome DevTools内存面板:
- 拍摄堆快照
- 执行操作
- 再次拍摄堆快照
- 对比快照
iOS Memory (Instruments)
iOS内存调试(Instruments)
bash
undefinedbash
undefinedRun with Leaks instrument
Run with Leaks instrument
xcrun instruments -t Leaks -D output.trace YourApp.app
undefinedxcrun instruments -t Leaks -D output.trace YourApp.app
undefinedAndroid Memory (LeakCanary)
Android内存调试(LeakCanary)
Add to build.gradle:
groovy
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'在build.gradle中添加:
groovy
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'Debugging Checklist
调试清单
When debugging issues:
- Check WebView console (Safari/Chrome DevTools)
- Check native logs (Xcode Console/Logcat)
- Verify plugin is installed and synced
- Check permissions (Info.plist/AndroidManifest)
- Test on real device (not just simulator)
- Try clean build ()
rm -rf node_modules && bun install - Verify capacitor.config.ts settings
- Check for version mismatches (capacitor packages)
调试问题时请检查:
- 检查WebView控制台(Safari/Chrome DevTools)
- 检查原生日志(Xcode控制台/Logcat)
- 验证插件已安装并同步
- 检查权限配置(Info.plist/AndroidManifest)
- 在真实设备上测试(而非仅模拟器)
- 尝试清理构建()
rm -rf node_modules && bun install - 验证capacitor.config.ts设置
- 检查版本不匹配问题(Capacitor相关包)
Resources
参考资源
- Capacitor Debugging Guide: https://capacitorjs.com/docs/guides/debugging
- Safari Web Inspector: https://webkit.org/web-inspector
- Chrome DevTools: https://developer.chrome.com/docs/devtools
- Xcode Debugging: https://developer.apple.com/documentation/xcode/debugging
- Android Studio Debugging: https://developer.android.com/studio/debug
- Capacitor调试指南:https://capacitorjs.com/docs/guides/debugging
- Safari Web Inspector:https://webkit.org/web-inspector
- Chrome DevTools:https://developer.chrome.com/docs/devtools
- Xcode调试:https://developer.apple.com/documentation/xcode/debugging
- Android Studio调试:https://developer.android.com/studio/debug