cordova-plugin-whitelist工作在Android上但不是iOS(Phonegap Build)

我正在编写一个封装在Cordova中的JavaScript应用程序,并使用Phonegap Build构build。 我们在我们的版本中包含了来自npm的cordova-plugin-whitelist ,并在我们的config.xml和一个开放的CSP( <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">添加了<access origin="*" /> <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> )。 该应用程序在Android上正常工作,并与我们的服务器交谈没有问题,但在iOS上,所有的请求都会立即失败,就好像白名单插件不让stream量通过一样。

我已经尝试了许多不同的构buildconfiguration,以防某些特定版本的cordova出现问题,但一直没有得到解决。 过去我曾经遇到类似于其他Phonegap / Cordova应用程序的类似问题,但能够使用白名单插件/ CSP /访问规则来解决这个问题。

这个问题也很难debugging,因为Safari开发者工具不能连接到iOS设备,我不得不提醒我看到的回应。 它看起来像返回的响应有一个状态码0和一个空的身体,我假设只是意味着无法访问。

您可能需要在Content-Security-Policy中设置connect-src,例如:

 <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://YOUR_HOST"> 

此外,对于Xcode 7 / iOS 9,如果您不使用SSL,则需要调整ATS设置以允许连接到非https后端。

以下是对应用程序信息.plist进行更改的一个工作示例:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

(注意你也可以configuration这个选项来允许非https连接)。

下面是一个脚本,你可以使用它作为iOS的预编译钩子来自动执行此操作:

 #!/bin/bash echo "Adjusting plist for App Transport Security exception." val=$(/usr/libexec/plistbuddy -c "add NSAppTransportSecurity:NSAllowsArbitraryLoads bool true" platforms/ios/PROJECTNAME/PROJECTNAME-Info.plist 2>/dev/null) echo "Done" 

只需换出项目名称的PROJECTNAME。