仅针对模拟器禁用应用程序传输安全性

3

我如何在模拟器上运行我的应用程序时仅禁用App Transport Security(同时在我的设备上运行应用程序时保持启用,即使在Debug模式下也是如此)?是否可以使用Swift代码而不是修改Info.plist文件来禁用它?

我之所以这么问,是因为我已通过下面的代码片段配置了一些内容,以便模拟器连接到在本地主机上运行的开发服务器(通过HTTP),而设备连接到在云中运行的生产服务器(通过HTTPS)。

#if arch(x86_64) || arch(i386) // simulator
let apiBaseURLString = "http://localhost:3000"
#else                          // device
let apiBaseURLString = "https://api.example.com"
#endif

理想情况下,我希望在模拟器上保持App Transport Security的启用状态,并通过HTTPS连接到运行于本地主机上的开发服务器。我之前已经做到了这一点,但是最近更新了Xcode后就不能用了。

2
你这样做的理由是什么?在模拟器和设备上运行时,是否访问不同的URL?否则,最好现在添加适当的ATS异常,以便在进行设备测试时不会出现问题。我认为在运行时没有改变Info.plist的方法,因为它是包的一部分,包不应该被更改。我认为更容易的解决方案是创建一个新的模拟器特定的构建配置,它有自己的Info.plist。 - wottle
我认为你应该看一下我的答案中的选项2,具体来说是“NSAllowsLocalNetworking”。 - wottle
好的。谢谢。另外,我刚刚在我的问题中添加了理想解决方案。 - ma11hew28
我猜测你的开发服务器 SSL 连接是使用自签名证书?这可能会有些棘手。我认为最好的方法是将本地网络例外添加到你的 info.plist 中。或者找出一种方法来恢复与你的开发服务器之间的有效 SSL 连接。 - wottle
是的,它正在使用自签名证书。我想我遵循了这个:https://github.com/seviu/iOS-SSL-localhost。好的。谢谢。 :-) - ma11hew28
2个回答

2

App Transport Security(ATS)由编译时读取 Info.plist 配置。即使你可以在运行时更改 Info.plist(实际上不可能),更改也不会影响 ATS 的执行。

我只能想到两个解决方案:

  1. 模拟器构建配置——您可以创建两个版本的 Info.plist,其中一个完全禁用 ATS,另一个用于在设备上运行。然后,您可以为在模拟器上运行的特定构建配置选择新的 Info-Simulator.plist,其中禁用了 ATS。缺点是您需要在运行模拟器之前更改构建配置,它不会自动使用正确的构建配置来区分模拟器和设备。

  2. 不要为模拟器设置不同的 ATS 设置。将 ATS 配置为同时处理模拟器和实体设备。有许多 ATS 异常选项可适用于大多数场景。需要本地网络连接的异常吗?请查看 NSAllowsLocalNetworking。需要在 Web 视图中获得更多灵活性吗?尝试 NSAllowsArbitraryLoadsInWebContent

不幸的是,您可以在运行时检测到模拟器,但无法在运行时更改 ATS 设置。您需要找到另一种方法,或重新评估是否真的需要在模拟器和设备上使用不同的配置。


  1. 可能不会。本地网络异常是在iOS 10中添加的。
  2. 影响将会是,如果您的应用程序尝试连接到本地网络上的资源,它将不会强制执行ATS要求。由于您的生产应用程序不会这样做,因此不会有任何影响。
- wottle
好的。根据Apple:Developer:Guides and Sample Code:Information Property List Key Reference:Cocoa Keys:NSAppTransportSecurity:Availability of ATS for Remote and Local Connections:“虽然ATS未强制执行连接到本地主机,但苹果强烈建议对任何本地连接使用传输层安全性(TLS),并使用自签名证书验证本地IP地址。” - ma11hew28
我将再次尝试弄清楚如何使模拟器通过HTTPS连接到运行在本地主机上的开发服务器。 - ma11hew28
如果您要发布的应用程序将连接到本地网络资源,我会同意避免异常。但是,您说您只是为了开发而这样做。如果是这样,请在使用开发服务器进行测试时使用异常,但在提交到商店之前请将异常删除并针对生产服务器进行测试。 - wottle
我找到了如何让运行iOS 10.3的iPhone模拟器通过HTTPS连接到我的本地开发服务器的方法。 - ma11hew28
显示剩余2条评论

-1

我认为这段代码应该可以访问.plist文件,你可以在此基础上进行所需的更改并设置相应的条件。

Bundle.main.object(forInfoDictionaryKey: key_name)

更新

这里我发布一张图片,请跟随它:

enter image description here

在这里,您可以获取以下值:

NSAllowsArbitraryLoads = 1;

通过这种方式,您可以根据自己的要求设置条件。

谢谢


3
OP希望在运行时更改数值,而不是在运行时读取数值。他们想要在模拟器中运行时禁用ATS。 - wottle
@wottle 是的,你说得对,我发帖是为了绕过这种情况,他想要的可以通过设置条件来实现,我觉得我做了一些不成熟的事情:P 不管怎样,你的解释很棒,顺便说一句,谢谢。 - Abhishek Mitra
很遗憾,ATS执行不能在运行时修改,因此即使他们可以读取Info.plist,也无法修改所需的行为。 - wottle
@wottle 我认为这是可能的,你可以更改 .plist 数据,关于运行时我不确定,但更改是可行的,那么 ATS 有什么问题呢?它应该被更改。 - Abhishek Mitra
由于 Info.plist 在编译时被读取,因此在运行时更改它不会对 ATS 的行为产生任何影响。此外,Info.plist 被复制到捆绑包中,并且已签名,因此无法在运行时更改。 - wottle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接