5

这个问题说明了一切。

我知道NSAllowsArbitraryLoads这可以放在一起,NSExceptionDomains但我对这种列入黑名单的方法有点困惑:我不想为除列出的特定生产主机之外的所有内容禁用 ATS,NSExceptionDomains因为它们可能会发生变化,所以我需要管理他们的列表连同一般应用程序配置,我们有 3+ 种不同的主机类型用于生产。[当然,在一个完美的世界中,Apple 会建议我们列出我们想要禁用 App Transport Security 的主机并为所有其他主机启用它 - 不是!反之亦然]

我还尝试继承我的用户定义设置$(MY_USER_SETTING)(它可以支持对应于 Debug/Staging/Release 的 3 个不同值),但它不能很好地与非字符串类型NSAppTransportSecurity(字典和NSAllowsArbitraryLoads布尔值)配合使用——这些值只是不继承我的用户定义设置。

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

4

2 回答 2

3

与人们的想法相反(一个例子:使用 APPLE 的 APP TRANSPORT SECURITYNSAllowsArbitraryLoads不能作为在黑名单/白名单模式之间切换的标志,至少它不能很好地与 Charles 配合使用:

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

示例 B:适用于所有人的 ATS,但有一些例外

如果您希望您的所有域都可以使用 ATS,除了一些您知道无法使用的域,您可以指定不应使用 ATS 的例外情况,同时选择所有其他流量。对于这种情况,您需要使用 NSExceptionDomains 指定您希望覆盖 ATS 的默认设置的域。

白名单方法(可行,但不是真正的好方法):如果NSAllowsArbitraryLoads设置为,YES则应用程序传输安全功能对所有域禁用,除了NSExceptionDomains.

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

相反,您可能只希望 ATS 在您明确知道可以支持它的域上工作。例如,如果您开发了一个 Twitter 客户端,您可能想要加载无数的 URL,这些 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。

于 2015-10-23T21:12:00.473 回答
2

我想你的答案就在那里。ATS 默认为所有主机启用。如果您仅为暂存主机禁用它,那么您的生产端点不会受此影响。也就是说,只需将您的暂存域添加到异常域即可。还是我误解了你的问题的细节?

于 2015-10-23T21:00:47.613 回答