如果我在模拟器上运行我的应用程序时仍然禁用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,它就破了。
答案 0 :(得分:1)
通过读取Info.plist,在编译时配置App Transport Security。即使您可以在运行时更改Info.plist(you can't),在运行时更改它实际上也不会对ATS实施产生任何影响。
我只能想到两个解决方案:
模拟器构建配置 - 您可以创建两个版本的Info.plist,其中一个完全禁用ATS,另一个用于在设备上运行。然后,您可以创建特定的构建配置以在模拟器上运行。在Build设置中,选择禁用ATS的新Info-Simulator.plist。这样做的缺点是,您需要在模拟器上运行之前更改构建配置 - 它不会自动使用正确的构建配置来模拟器与设备。
模拟器没有不同的ATS设置。配置ATS以处理模拟器和物理设备。对于大多数情况,ATS异常有很多选项。需要本地网络连接的例外吗?查看NSAllowsLocalNetworking
。在webview中需要更多灵活性吗?试试NSAllowsArbitraryLoadsInWebContent
。
不幸的是,您可以在运行时检测模拟器,但不能在运行时更改ATS行为。您需要找到另一种方法,或者重新评估您是否真的需要在模拟器与设备上使用不同的配置。
答案 1 :(得分:0)