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

时间:2015-10-14 16:17:53

标签: android ios cordova phonegap-build cordova-plugins

我正在开发一个用Cordova包装并使用Phonegap Build构建的JavaScript应用程序。我们在构建中包含了来自npm的cordova-plugin-whitelist,并在我们的index.html中添加了<access origin="*" />到我们的config.xml和一个开放的CSP(<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">)。该应用程序在Android上运行良好,可以毫无问题地与我们的服务器通信,但在iOS上,所有请求都会立即失败,就像白名单插件不允许通过流量一样。

我已经尝试了许多不同的构建配置,以防特定版本的Cordova中出现问题,但根本无法使其工作。我过去曾遇到过与其他Phonegap / Cordova应用程序类似的问题,但是能够使用白名单插件/ CSP /访问规则来解决它。

此问题也很难调试,因为Safari开发人员工具无法连接到iOS设备,我不得不提醒我看到的响应。看起来回复的响应有一个状态代码0和一个空体,我假设它只是意味着无法访问。

2 个答案:

答案 0 :(得分:4)

您可能需要在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>

(注意,您也可以将其配置为选择性地允许非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替换为项目名称即可。

答案 1 :(得分:0)

将您的访问代码更改为:

<access origin="https://yourdomain.com" requires-certificate-transparency='false' allows-arbitrary-loads-in-web-content='true'/>

它将在NsAppTransportSecurity条目中相应地更新Info.Plist文件。

来源:https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/#ios-whitelisting