设置Allow Arbitrary Loads为YES后仍遇ATS阻止明文HTTP请求的问题
哥们儿,我太懂你这种设置完ATS选项还踩坑的憋屈感了!明明把Allow Arbitrary Loads改成YES,结果还是弹出那句“Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure”的错误,咱们一步步排查解决:
1. 先检查Info.plist的ATS配置结构和拼写
这是最容易踩的坑!很多人要么把配置放错了层级,要么拼错了键名。正确的ATS配置必须嵌套在NSAppTransportSecurity字典下,而且键名是NSAllowsArbitraryLoads(注意是Allows,不是Allow!少了个s直接失效)。
正确的Info.plist代码(XML格式)应该是这样:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
如果你用Xcode的可视化编辑器编辑Info.plist,一定要确保App Transport Security Settings(对应NSAppTransportSecurity)下面的Allow Arbitrary Loads开关是打开的,别把这个选项直接放在根目录里。
2. 排查是否有冲突的ATS例外规则
如果你的Info.plist里还配置了NSExceptionDomains(比如给特定域名加ATS例外),有时候会和NSAllowsArbitraryLoads产生优先级冲突——哪怕你开了全局允许,个别域名的例外规则可能会覆盖全局设置。
建议先暂时注释掉所有NSExceptionDomains相关的配置,重新运行APP测试,如果问题解决了,再慢慢调整例外规则。
3. 清理缓存,重新部署APP
Xcode或者设备的缓存有时候会“记住”旧的配置,导致新的ATS设置不生效。试试这几步:
- 清理Xcode构建缓存:点击顶部菜单
Product -> Clean Build Folder(快捷键Shift+Cmd+K) - 模拟器:删除里面的APP,重启模拟器;真机:卸载APP,重启设备
- 重新编译并安装APP到设备/模拟器
4. 确认请求URL的正确性
别笑!有时候可能是自己把请求URL拼错了,比如写成htpp://而不是http://,或者目标地址其实是HTTPS但你误以为是HTTP,先仔细核对你的请求地址:
NSString *path=[[NSString alloc] initWithFormat:@"/su"]; NSMutableDictionary *param=[[NSMutableDictionary alloc] init]; [param setValue:@"facebook" forKey:@"wd"]; // 检查你拼接后的完整URL是不是标准的http://开头
如果以上步骤都试过还是不行,你可以打开Xcode的Console面板,看看有没有更详细的ATS报错信息,里面会指明是哪个域名被拦截,有助于进一步排查。
内容的提问来源于stack exchange,提问作者Ran

