React Native iOS环境下仅Staging构建配置Charles Proxy证书信任的方法咨询
React Native iOS环境下仅Staging构建配置Charles Proxy证书信任的方法咨询
我之前也踩过一模一样的坑!Android那边靠network_security_config给Staging单独配Charles证书确实丝滑,iOS这边得折腾几个小步骤,但完全能实现只给Staging构建开这个权限,下面是我亲测有效的方案:
第一步:先搞定Charles证书的格式和导入
首先把Charles的根证书导出成iOS兼容的格式:
- 打开Charles,顶部菜单点「Help」→「SSL Proxying」→「Save Charles Root Certificate」,选保存成
.cer格式(别存成pem,iOS认cer更顺畅) - 把这个
.cer文件拖到你的React Native iOS项目目录里,比如ios/Resources/Certificates
第二步:给Staging构建单独绑定证书(核心!)
如果你的项目还没专门的Staging构建Target,先去Xcode的Project设置里,复制现有的Debug Target,改名叫「Staging」——这步是基础,确保Staging有独立的构建配置,不干扰其他环境。
然后:
- 打开Xcode,把刚才的Charles证书拖进项目,只勾选Staging Target的「Add to targets」,别勾Debug/Release,这样只有Staging构建会打包这个证书
- 去Staging Target的「Build Phases」→「Copy Bundle Resources」里确认证书已经在列表里,Debug/Release的这个列表里绝对不能有它
第三步:配置ATS仅Staging信任Charles证书
iOS的ATS(App Transport Security)默认会拦截自签名证书,我们得给Staging单独开绿灯,而且绝不碰Release的配置:
- 打开Staging Target专属的Info.plist(如果是共享Info.plist,就用Xcode的构建配置变量来控制逻辑),添加以下配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <!-- 全局关ATS,只给需要的域名开权限,更安全 --> <key>NSExceptionDomains</key> <dict> <!-- 替换成你需要抓包的API域名,比如你的后端接口域名 --> <key>your-api-domain.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> </dict> </dict> <!-- 如果你需要全局抓所有HTTPS请求,就把上面的NSAllowsArbitraryLoads改成true,但不推荐,尽量用域名白名单 --> </dict> - 如果你用xcconfig管理构建配置,直接在
Staging.xcconfig里加:INFOPLIST_KEY_NSAppTransportSecurity = { NSExceptionDomains = { your-api-domain.com = { NSIncludesSubdomains = YES; NSTemporaryExceptionAllowsInsecureHTTPLoads = YES; NSTemporaryExceptionMinimumTLSVersion = TLSv1.2; } } }
第四步:iOS设备端的最后一步(必须!)
不管你怎么配置项目,iOS 10+之后,必须在设备上手动信任Charles的根证书:
- 用Staging构建包安装到设备后,打开「设置」→「通用」→「VPN与设备管理」,找到Charles的证书,点「信任」
- 这一步只有第一次装Staging包时需要做,之后就不用重复操作了
额外小技巧:用构建脚本自动配置
如果每次手动改Xcode太麻烦,你可以在package.json里加个Staging构建的脚本,自动帮你把证书加入Staging Target:
"scripts": { "ios:staging": "react-native run-ios --configuration Staging && ./scripts/setup-charles-cert.sh" }
然后写个简单的setup-charles-cert.sh脚本(放在项目根目录的scripts文件夹):
#!/bin/bash # 仅给Staging Target添加Charles证书,不影响其他环境 xcodebuild -project ios/YourProjectName.xcodeproj -target Staging -add-resource "ios/Resources/Certificates/charles.cer"
这样每次跑npm run ios:staging,就自动给Staging构建配上Charles证书,完全不干扰Debug和Release包!
我用这套方案跑了大半年,Staging包能正常抓所有HTTPS请求,Release包完全不受影响,你可以试试~




