仅禁用模拟器的App Transport Security

时间:2017-04-06 13:51:57

标签: ios xcode simulator app-transport-security

如果我在模拟器上运行我的应用程序时仍然禁用App Transport Security(虽然在我的设备上运行应用程序时仍保持启用状态,即使在调试模式下)?有没有办法用Swift代码禁用它而不是修改Info.plist文件?

我问,因为我已经配置了东西(通过下面的代码片段),以便模拟器连接(通过HTTP)到运行在localhost上的开发服务器,并且设备连接(通过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连接到运行在localhost上的开发服务器。我有这个工作,但我刚刚更新了Xcode,它就破了。

2 个答案:

答案 0 :(得分:1)

通过读取Info.plist,在编译时配置App Transport Security。即使您可以在运行时更改Info.plist(you can't),在运行时更改它实际上也不会对ATS实施产生任何影响。

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

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

  2. 模拟器没有不同的ATS设置。配置ATS以处理模拟器和物理设备。对于大多数情况,ATS异常有很多选项。需要本地网络连接的例外吗?查看NSAllowsLocalNetworking。在webview中需要更多灵活性吗?试试NSAllowsArbitraryLoadsInWebContent

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

答案 1 :(得分:0)

我认为此代码应该可以访问.plist文件,根据此代码,您可以根据需要进行更改,并为此设置条件。

Bundle.main.object(forInfoDictionaryKey: key_name)

<强>更新

我在这里发布图片请注意:

enter image description here

您可以在此获取以下值:

NSAllowsArbitraryLoads = 1;

通过这个你可以根据你的要求提出一个条件。

由于