【iOS】ATS:App Transport Security Settings

写在前面

之前做的项目,只要是报错就去搜,然后在info.plist里配置App Transport Security SettingsAllow 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=, 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的形式不同之外,访问的资源应该是同一个(请求参数及请求方式相同的情况下)。但是就是这么一个小小的,不起眼的请求,却让我迷惑了两天。

思考

思考的过程一定伴随着资料的查询

  1. 我看了官方的文档,查询关键字NSAppTransportSecurity
截屏2020-07-20下午4.22.57.png

只是说了HTTP是不安全的,大家都使用HTTPS吧。并没有提及域名相关的字眼。

  1. 于是,我又去看DNS查询的资料,网上无非都是四种查询以及缓存查询的流程。和我们这个问题看起来没有啥关系啊

分割线*2,哈哈哈


初步结论:

因为最近在做Network Extensions 相关的代理功能,你懂的。有域名污染的操作。
难道因为DNS解析过程中会有被拦截的可能,但是ip却不会,所以域名形式URL进行的HTTP访问就被苹果的ATS认为是不安全的,但是IP形式URL进行的HTTP就是安全的?

目前我就想到这么多,很勉强的解释吧。
因为代码就是这么表现的,我就这么猜的。

你可能感兴趣的:(【iOS】ATS:App Transport Security Settings)