由于项目的正式网络环境的 host 是走域名,能支持 https ,测试网络环境的 host 是走 IP ,无法支持 https ,导致在做 ATS 支持的时候,遇到一个问题:在 debug 过程需要切换网络环境的时候,也需要手动去开启或者关闭 ATS 。为了节省这些时间,写了一个脚本去解决这个问题,让 ATS 根据网络环境的值自动去开启或者关闭。下面将会列出具体步骤。
1.在 [Your Target
-Build Settings -Preprocessor Macros] 添加你的环境宏变量 NETWORK_FOR_PRODUCTION
,如下图:
2.在项目的 Info.plist
文件中添加 NSAppTransportSecurity
,类型为字典;然后在字典中添加一个 NSAllowsArbitraryLoads
,类型为布尔值。
1 | <key>NSAppTransportSecurity</key> |
关于配置的坑
在 iOS 10下,多了NSAllowsArbitraryLoadsForMedia
和NSAllowsArbitraryLoadsInWebContent
两个选项。
当这2个选项与NSAllowsArbitraryLoads
选项同时存在时,在 iOS 10 下,会优先看NSAllowsArbitraryLoadsForMedia
和NSAllowsArbitraryLoadsInWebContent
的配置,而忽略掉NSAllowsArbitraryLoads
。
基于以上规则,遇到的坑是:我设置了NSAllowsArbitraryLoadsInWebContent
为true
(允许浏览器加载http网页),设置了NSAllowsArbitraryLoads
为false
(关闭ATS),在 iOS 10 下,运行APP,ATS 实际上并没有被关闭,因为 iOS 10 优先看了NSAllowsArbitraryLoadsInWebContent
的配置,认为 ATS 是开启的, 而NSAllowsArbitraryLoads
的配置是直接被忽略了。
3.在 [Your Target
-Build Phases-Run Script] 添加以下脚本代码即可:
1 | NETWORK_FOR_PRODUCTION=`echo ${GCC_PREPROCESSOR_DEFINITIONS} | awk '{print $4}' | awk -F'[=]' '{print $2}'` |
其中Run Script
的配置如下图:
关键脚本代码详解:
1 NETWORK_FOR_PRODUCTION=`echo ${GCC_PREPROCESSOR_DEFINITIONS} | awk '{print $4}' | awk -F'[=]' '{print $2}'`此句代码是通过awk解析获取
NETWORK_FOR_PRODUCTION
的具体值:0或者1
PS:如果你需要根据其他变量来设置 ATS ,则需要自己调整上述语句,获取你指定的变量的值。
4.如常运行调试代码即可~enjoy😄