Ios 为发布配置启用NSAppTransportSecurity并为调试/登台配置禁用它的安全可靠方法?

Ios 为发布配置启用NSAppTransportSecurity并为调试/登台配置禁用它的安全可靠方法?,ios,charles-proxy,app-transport-security,Ios,Charles Proxy,App Transport Security,问题说明了一切 我知道可以将nsAllowsArbityLoads放在一起NSExceptionDomains但我对这种黑名单方法有点困惑:我不想对所有内容禁用ATS,除了NSExceptionDomains列出的特定生产主机之外,因为它们可能会发生更改,因此我需要管理它们他们的列表以及通用应用程序配置,其中我们有3+种不同的主机类型用于生产。[当然,在一个完美的世界中,苹果会建议我们列出我们想要禁用应用程序传输安全的主机,并为所有其他主机启用应用程序传输安全-而不是!反之亦然] 我还尝试继承我

问题说明了一切

我知道可以将
nsAllowsArbityLoads
放在一起
NSExceptionDomains
但我对这种黑名单方法有点困惑:我不想对所有内容禁用ATS,除了
NSExceptionDomains
列出的特定生产主机之外,因为它们可能会发生更改,因此我需要管理它们他们的列表以及通用应用程序配置,其中我们有3+种不同的主机类型用于生产。[当然,在一个完美的世界中,苹果会建议我们列出我们想要禁用应用程序传输安全的主机,并为所有其他主机启用应用程序传输安全-而不是!反之亦然]

我还尝试继承我的用户定义设置
$(我的用户设置)
(它可以支持与调试/暂存/发布相对应的3个不同值)但是,它不能很好地处理非字符串类型的
NSAppTransportSecurity
,这是字典和
NSAllowsArbitraryLoads
boolean–这些值不会继承我的用户定义设置


背景:我希望能够使用Charles Proxy查看调试/登台配置的HTTP流量,从iOS 9开始,它要求禁用ATS,我希望确保这不会以任何方式影响我们的发布配置

我想你的答案就在那里。 默认情况下,所有主机均启用ATS。 如果仅对暂存主机禁用它,则生产终结点不受此影响。 也就是说,只需将暂存域添加到异常域中即可。
或者我误解了你问题的具体内容了吗?

与人们的想法相反(一个例子:)
NSAllowsArbitraryLoads
不能作为在黑名单/白名单模式之间切换的标志,至少它不适合Charles:

黑名单方法(在IOS 9.0中不适用于我-Charles不识别来自/到临时主机的流量):

示例B:除某些例外情况外,所有ATS

如果您希望您的所有域都能使用ATS,但您知道其中一些域不起作用,则可以指定不应使用ATS的例外情况,同时保留所有其他流量。在这种情况下,您需要使用NSExceptionDomains来指定要覆盖ATS默认设置的域

白名单方法(有效,但不是一种很好的方法):如果
nsAllowsArbityLoads
设置为
YES
,则除
NSExceptionDomains
下列出的域外,所有域的应用程序传输安全功能都被禁用

示例C:ATS禁用,但有一些例外

相反,您可能只希望ATS在您明确知道可以支持它的域上工作。例如,如果您开发了一个Twitter客户端,那么可能会有无数URL需要加载,但这些URL可能无法支持ATS,尽管您希望登录调用和对Twitter的其他请求使用ATS。在这种情况下,您可以禁用ATS作为默认设置,然后指定您希望使用ATS的URL


这里描述的另一种方法:建议添加“运行脚本构建阶段”,使用PlistBuddy动态修补应用程序的plist文件。下面是他们的示例,当开发人员在其本地计算机上针对服务器工作时(当然也可以是临时主机),使应用程序不使用ATS:



在我看来,修补Plist是比使用上述白名单方法更好的有条件地禁用临时主机ATS的方法,因此我们将继续使用PlistBuddy。

您可以添加一个构建阶段来运行在调试构建中编辑Plist的脚本。请参阅:如果您不希望您的暂存域在应用程序捆绑包中可见,您将如何发布到应用商店?
/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