Cordova(Phonegap)ajax呼叫挂在iphone设备上

时间:2015-10-19 22:10:01

标签: ios ajax cordova

我做的ajax调用与浏览器和android一起使用,但是当在iphone上运行时它会永久挂起,或者如果添加了超时选项则会超时。

ajax看起来像:

$.ajax({
  url: "http://pbcc.ca/xxx/index.php",
  data: {api: 'test'},
  type: "GET",
  dataType: "jsonp",
  jsonp: 'callback',
  beforeSend: function() {
    alert("beforeSend");
  },
  success: function(data) {
    alert("success");
  },
  error: function(e,x) {
    alert("error");
  }
});

我在文件就绪和设备准备就绪之后尝试过,只有在两种情况下才发送响应。网上有几个类似问题的帖子,我尝试了一些方法,但没有一个解决了我的问题。有人可以帮忙吗?感谢。

更新:在服务器端测试,服务器没有响应来自ios的ajax调用。实际上我认为没有数据传输到服务器。

UPDATE2

我收到此错误:

Refused to load the script 'http://www.pbcc.ca/xxx/index.php?callback=...' because it violates the following Content Security Policy directive: "default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'". Note that 'script-src' was not explicitly set, so 'default-src' is used as a fallback.

元:

<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://pbcc.ca">

Info.plist(我一开始并没有将它们放在一起):

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
  <key>NSExceptionDomains</key>
  <dict>
    <key>pbcc.ca</key>
    <dict>
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>

config.xml(默认由cordova创建):

&#13;
&#13;
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.polarbear.lunch" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>xxx</name>
    <description>
        A sample Apache Cordova application that responds to the deviceready event.
    </description>
    <author email="dev@cordova.apache.org" href="http://cordova.io">
        Apache Cordova Team
    </author>
    <content src="index.html" />
    <plugin name="cordova-plugin-whitelist" version="1" />
    <access origin="*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <platform name="android">
        <allow-intent href="market:*" />
    </platform>
    <platform name="ios">
        <allow-intent href="itms:*" />
        <allow-intent href="itms-apps:*" />
    </platform>
</widget>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

Xcode 7将使用iOS 9,默认情况下不允许HTTP后端调用,除非使用NSAllowsArbitraryLoads覆盖并禁用App Transport Security或配置例外。

以下是更改应用信息.plist的实例:

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

这是一个脚本,您可以将其用作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替换为项目名称即可。

您也可以只为您的服务器设置一个例外,而不是启用所有后端的http连接......为此使用类似的东西:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>pbcc.ca</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

此外,您需要在index.html中的Cordova内容安全策略元标记中设置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://pbcc.ca">

或使用:

connect-src *

如果您想打开连接到任何地方进行Ajax调用。有关内容安全政策的更多信息可以是found here configuration tool here

您需要同时执行这些更改(内容安全策略和应用传输安全性异常)才能使其适用于iOS 9 / Cordova 5 / XCode 7。

除了您发布的错误&#34;拒绝加载脚本&#39; http://www.pbcc.ca/xxx/index.php?callback= ...&#39;因为它违反了以下内容安全策略指令:&#34; default-src&#39; self&#39;数据:差距:https://ssl.gstatic.com&#39; unsafe-eval&#39;&#34;。请注意&#39; script-src&#39;没有明确设置,所以&#39; default-src&#39;被用作后备。&#34;

我们可以看到发生的事情是您不允许加载远程文档,因为它违反了您的内容安全策略。要解决此问题,请将default-src设置为*或添加script-src www.pbcc.ca.例如:

<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://pbcc.ca; script-src http://www.pbcc.ca">

请注意,您正在混合和匹配www.pbcc.ca和pbcc.ca,因此您可能需要确保指定正确的一个,或使用*将其打开以确保其正常工作然后将其锁定为特定的主人。