使用Alamofire调用API时遇NSURLErrorDomain Code=-1022错误求解决
解决Alamofire访问HTTP API时的NSURLErrorDomain Code=-1022错误
这个NSURLErrorDomain Code=-1022错误我太熟悉了——本质是App Transport Security (ATS) 在搞事情!
错误根源
iOS的ATS机制默认要求App只能访问HTTPS加密的网络资源,而你要调用的目标API是HTTP协议的(http://minecraftpocket-servers.com/...),直接触发了ATS的安全拦截。其他API能正常工作,大概率是因为它们用的是HTTPS协议。
另外还要注意:你提供的API URL里有&,这是HTML转义后的&符号,Alamofire解析时可能会出问题,建议替换成普通的&,正确的URL应该是:http://minecraftpocket-servers.com/api/?object=servers&element=voters&key=833gowl7nz7jyqaqx96dagqzamn431yr9h&month=current&format=json&limit=10
解决方案
方案一:仅允许目标域名的HTTP访问(推荐,更安全)
这种方式只放开你需要的域名,不会降低整个App的安全性。操作步骤如下:
- 打开项目的
Info.plist文件 - 添加一个名为
NSAppTransportSecurity的字典 - 在这个字典里添加
NSExceptionDomains字典 - 在
NSExceptionDomains里添加minecraftpocket-servers.com字典,设置以下两个键值对:NSIncludesSubdomains: 布尔值设为YESNSExceptionAllowsInsecureHTTPLoads: 布尔值设为YES
对应的plist代码示例(可直接复制到plist源代码视图):
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>minecraftpocket-servers.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
方案二:全局关闭ATS(不推荐,仅用于测试)
如果只是临时测试需要,可以全局关闭ATS,但上线App时不建议这么做,会降低整个App的网络安全性:
- 打开
Info.plist文件 - 添加
NSAppTransportSecurity字典 - 在字典里添加
NSAllowsArbitraryLoads键,布尔值设为YES
对应的plist代码:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
先修正URL的&问题,再配置ATS,应该就能正常调用这个API了。
内容的提问来源于stack exchange,提问作者user8969667
相关产品推荐
相关产品推荐

