我做的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创建):
<?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;
答案 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,因此您可能需要确保指定正确的一个,或使用*将其打开以确保其正常工作然后将其锁定为特定的主人。