写在前面
之前做的项目,只要是报错就去搜,然后在info.plist里配置App Transport Security Settings
的Allow Arbitrary Loads
属性(具体属性的设置及其作用应该没啥难的,就不哔哔了)等。然后项目能运行就不管了。
直到我在写这记录的时候,依然没有整明白。
问题
示例URL:
url_domainName: http://local.group.site:305/path/subpath?query=para
url_ip: http://199.255.0:305/path/subpath?query=para
1. APP中的info.plist的ATS不禁用,也就是默认开启安全连接。Allow Arbitrary Loads 默认为false。(新建工程,不修改plist文件的App Transport Security Settings
)
问题表现为:
- 用url_domainName去请求
会报1022,就是
Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyingError=0x102423790 {Error Domain=kCFErrorDomainCFNetwork Code=-1022}, NSErrorFailingURLStringKey=http://local.group.site:305/path/subpath?query=para, NSErrorFailingURLKey=<private>, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}
- 用url_ip去请求
就能正常拿到数据
2.APP中的info.plist的ATS禁用
那么不管是域名的还是ip形式的URL,都能正常工作。至此,皆大欢喜,也不考虑为啥。
可是我就纳闷了,这不都是指向的同一个资源么,中间也就多了DNS解析操作啊,协议都是http啊,请求用的都是NSURLSession啊,在ATS开启的情况下为啥表现不同呢???????理论上不管是域名形式的还是ip形式的HTTP,都应该报1022啊,为啥一个可以一个1022呢
其中,运营商那边配置的local.group.site对应的ip只有这一个ip199.255.0;上面两个URL对于发起请求的客户端来说,除了URL的形式不同之外,访问的资源应该是同一个(请求参数及请求方式相同的情况下)。但是就是这么一个小小的,不起眼的请求,却让我迷惑了两天。
思考
思考的过程一定伴随着资料的查询
- 我看了官方的文档,查询关键字
NSAppTransportSecurity
只是说了HTTP是不安全的,大家都使用HTTPS吧。并没有提及域名相关的字眼。
- 于是,我又去看DNS查询的资料,网上无非都是四种查询以及缓存查询的流程。和我们这个问题看起来没有啥关系啊
分割线*2,哈哈哈
初步结论:
因为最近在做Network Extensions 相关的代理功能,你懂的。有域名污染的操作。
难道因为DNS解析过程中会有被拦截的可能,但是ip却不会,所以域名形式URL进行的HTTP访问就被苹果的ATS认为是不安全的,但是IP形式URL进行的HTTP就是安全的?
目前我就想到这么多,很勉强的解释吧。
因为代码就是这么表现的,我就这么猜的。