You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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有独立的构建配置,不干扰其他环境。

然后:

  1. 打开Xcode,把刚才的Charles证书拖进项目,只勾选Staging Target的「Add to targets」,别勾Debug/Release,这样只有Staging构建会打包这个证书
  2. 去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包完全不受影响,你可以试试~

火山引擎 最新活动