这个问题说明了一切。
我知道可以合并NSAllowsArbitraryLoads
NSExceptionDomains
但是我对这种黑名单方法感到有点困惑:我不想为除{{{{{{ 1}}因为它们可能会发生变化,因此我需要与常规应用程序配置一起管理它们的列表,其中我们有3种不同的主机类型用于生产。 [当然,在一个完美的世界中,Apple会建议我们列出我们想要禁用App Transport Security的主机并为所有其他主机启用它 - 不是!反之亦然]
我还尝试继承我的用户定义设置NSExceptionDomains
(它可以支持3个与Debug / Staging / Release相对应的不同值),但它不适用于$(MY_USER_SETTING)
的非字符串类型这是字典和NSAppTransportSecurity
布尔值 - 这些值只是不继承我的用户定义的设置。
背景:我希望能够使用Charles Proxy查看我们的调试/暂存配置的HTTP流量,从iOS 9开始,它要求禁用ATS,我想确保这不会影响我们的Release配置无论如何!
答案 0 :(得分:2)
我认为你的答案就在那里。 默认情况下,为所有主机启用ATS。 如果仅为暂存主机禁用它,则生产端点不受此影响。 也就是说,只需将您的暂存域添加到例外域即可。 或者我是否误解了你问题的具体细节?
答案 1 :(得分:2)
与人们的想法形成鲜明对比(一个例子:WORKING WITH APPLE’S APP TRANSPORT SECURITY)NSAllowsArbitraryLoads
不能作为在黑名单/白名单模式之间切换的标志,至少它与查尔斯并不相符:
黑名单方法(在IOS 9.0中不适用于我 - Charles无法识别来自/到分段主机的流量):
示例B:所有人的ATS,但有一些例外
如果您希望所有域都使用ATS,除了一些您知道无法使用的域,您可以指定不应使用ATS的例外情况,同时保留所有其他流量选择。对于这种情况,您将要使用NSExceptionDomains指定您希望覆盖ATS默认设置的域。
白名单方法(WORKS,但实际上并不是一个很好的方法):如果NSAllowsArbitraryLoads
设置为YES
,那么应用程序传输安全功能已禁用适用于NSExceptionDomains
下列出的所有域名。
示例C:禁用ATS,但有一些例外
相反,您可能只希望ATS在您特别知道可以支持的域上工作。例如,如果您开发一个Twitter客户端,那么您可能想要加载的无数URL可能无法支持ATS,但您可能需要登录调用和Twitter的其他请求来使用ATS。在这种情况下,您可以禁用ATS作为默认值,然后指定您希望使用ATS的URL。
此处描述的另一种方法:This One Weird Trick Makes Developing iOS Apps Against a Local Server Way Easier建议添加"运行脚本构建阶段"它使用PlistBuddy来动态修补应用程序的plist文件。以下是当开发人员对其本地计算机上的服务器进行操作时,使应用程序不使用ATS的示例(当然也可以是暂存主机):
/usr/libexec/PlistBuddy -c "Add :NSAppTransportSecurity:NSExceptionDomains:$LOCAL_NETWORK_NAME:NSIncludesSubdomains bool true" $INFO_PLIST
/usr/libexec/PlistBuddy -c "Add :NSAppTransportSecurity:NSExceptionDomains:$LOCAL_NETWORK_NAME:NSThirdPartyExceptionAllowsInsecureHTTPLoads bool true" $INFO_PLIST
IMO,修补Plist是一种更好的方法来有条件地禁用ATS用于登台主机,而不是使用上面描述的白名单方法,因此我们将坚持使用PlistBuddy。