关于 iOS 10 中 ATS 的问题

2016-12-06  本文已影响0人  FongG

关于 iOS 10 中 ATS 的问题

原文地址:https://onevcat.com/2016/06/ios-10-ats/

PS:另外填上如何使用AFNetWorking实现
https:http://www.cnblogs.com/jys509/p/5001566.html

本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新。

*https证书购买:http://www.wosign.com/price_client.htm

总结一下就是以下两点:

对于 API 请求,基本上是必须使用 HTTPS 的,特别是如果你们自己可以管理服务器的话。可能需要后端的同学尽快升级到 HTTPS (不过话说虽然是用 Let's Encrypt 的,我一个个人博客都启用 HTTPS 了,作为 API 的用户服务器,还不开 HTTPS 真有点说不过去)。如果使用的是第三方的 API,而他们没有提供 HTTPS 支持的话,需要在NSExceptionDomains中进行添加。

如果你的 app 只支持 iOS 10,并且有用户可以自由输入网址进行浏览的功能,或者是在线视频音频播放功能的话,只加入NSAllowsArbitraryLoadsInWebContent或/和NSAllowsArbitraryLoadsForMedia,并且将组件换成UIWebView或WKWebView,以及AVFoundation中的 player 就可以了。如果你还需要支持 iOS 9,并且需要访问网页和视频的话,可能只能去开启NSAllowsArbitraryLoads然后提交时进行说明,并且看 Apple 审核员的脸色决定让不让通过了。除了WKWebKit以外,另外一个访问网页的选择是使用SFSafariViewController。因为其实SFSafariViewController就是一个独立于 app 的 Safari 进程,所以它完全不受 ATS 的限制。
如果你需要使用内网,可以设置NSAllowsLocalNetworking,而不必担心 SSL 连接的问题。

另外,当NSAllowsArbitraryLoads和NSAllowsArbitraryLoadsInWebContent或NSAllowsArbitraryLoadsForMedia同时存在时,根据系统不同,表现的行为也会不一样。简单说,iOS 9 只看NSAllowsArbitraryLoads,而 iOS 10 会优先看InWebContent和ForMedia的部分。在 iOS 10 中,要是后两者存在的话,在相关部分就会忽略掉NSAllowsArbitraryLoads;如果不存在,则遵循NSAllowsArbitraryLoads的设定。

说起来可能有点复杂,我在这里总结了一下根据NSAppTransportSecurity中设定条件不同,所对应的系统版本和请求组件的行为的不同,可以作为你设置这个字典时的参考 (表中使用了NSAllowsArbitraryLoadsInWebContent作为例
子.

作为参考,这里将有效的NSAppTransportSecurity字典结构也一并附上:

NSAppTransportSecurity : 
Dictionary {  
  NSAllowsArbitraryLoads  :Boolean
  NSAllowsArbitraryLoadsForMedia :Boolean
  NSAllowsArbitraryLoadsInWebContent :Boolean
  NSAllowsLocalNetworking :Boolean
  NSExceptionDomains : 
   Dictionary {:
 Dictionary {              
NSIncludesSubdomains : Boolean            NSExceptionAllowsInsecureHTTPLoads : Boolean            NSExceptionMinimumTLSVersion : String            NSExceptionRequiresForwardSecrecy : Boolean 
 // Default value is YES          
  NSRequiresCertificateTransparency : Boolean  
      }  
  }
}
上一篇 下一篇

猜你喜欢

热点阅读