我正在 XCode 上开发一个 Cordova 项目。
我正在使用 Cordova v5.4.1、Xcode v7.2 和 iOS 模拟器 v9.2。
该应用程序正在模拟器上成功构建和部署,但未使用 REST Web 服务。我能够在模拟器的 Safari 浏览器中查看来自 Web 服务的 JSON 响应,但应用程序显示的并不相同。
我在开发人员设置中启用了“允许 HTTP 服务”,还尝试重新启动模拟器和 Xcode,但没有任何帮助。我还将这些行添加到 config.xml。
<plugin name="cordova-plugin-whitelist" spec="1" />
<access origin="*" />
如何解决这个问题?
最佳答案
也许您被 iOS 9 ATS(应用程序传输安全)阻止了?
要测试是否是这种情况,请在您的 Mac 上使用 Terminal.app 试试这个:
nscurl --ats-diagnostics https://api.your-server.com
如果 ATS 允许连接到 https://api.your-server.com ,您应该在响应的第一个 block 中看到:
Default ATS Secure Connection
---
ATS Default Connection
Result : PASS
---
任何其他情况都意味着 ATS 会阻止 HTTP(S) 请求通过。
要解决此问题,您可以从根本上解决问题(使用带 TLS 1.2、SHA256 或更好的 HTTPS,以及前向保密),这是推荐的解决方案,但并非总是可行,或者为您的服务器定义一个异常(exception)在您的 App-Info.plist
文件中被允许。示例:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>api.your-server.com</key>
<dict>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
有关 ATS 的更多信息,以及可用于定义异常的值:https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html
如果一切都失败了,你可以尝试使用这个 Cordova 插件: https://github.com/robertklein/cordova-ios-security 但我不推荐它,因为它会完全禁用 ATS,这是一个非常糟糕的主意™。
关于iOS 模拟器未连接到网络服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35046567/