Ajax在IOS 9.0 Cordova中不起作用

$.ajax({ type: "GET", url: "http://myweb/php", success: function (data){ alert(data); }, error:function(xhr,textStatus,err) { alert("readyState: " + xhr.readyState); alert("responseText: "+ xhr.responseText); alert("status: " + xhr.status); alert("text status: " + textStatus); alert("error: " + err); } }); 

我得到的结果是:

 readyState:0 responseText:"" status:0 text status:error error:"" 

我尝试在我的PHP中添加标题,但仍然无法正常工作。 在我将xcode更新为7.0并将ios模拟器更新为9.0之前,ajax代码正常工作。

 header('Content-Type: application/json'); header('Access-Control-Allow-Origin: *'); 

据我所知,整个ATS( App Transport Security – iOS 9 )的东西,来自area28的推荐方法不应该是你在应用程序中使用的方法。

 NSAppTransportSecurity  NSAllowsArbitraryLoads  

这将允许对每个域的所有外部请求绝对不是您应该使用它的方式 。 在我看来,你应该在你的info.plist定义一个新的并添加这个代码(编辑info.plist你可以使用普通的文本编辑器,如崇高的文本等):

 NSAppTransportSecurity  NSExceptionDomains  domain.tld  NSIncludesSubdomains  NSTemporaryExceptionAllowsInsecureHTTPLoads  NSTemporaryExceptionMinimumTLSVersion TLSv1.1    

这将仅允许对您指定的域的请求。 描述的方式是苹果在WWDC 2015上介绍的方式。 正如您在屏幕截图中看到的那样,这是苹果希望用户使用它的方式。

如果你没有指定任何东西,你会得到

无法加载错误的网页:无法加载资源,因为App Transport Security策略要求使用安全连接。

所以,像我说的那样改变它,错误就消失了。 在此处输入图像描述

如果您正在使用Xcode项目,则可能需要编辑info.plist文件。 安全性因iOS9而改变。 Apple强烈建议尽可能使用https进行网络请求。 以下是与此问题相关的答案。

从那篇文章:

将其添加到info.plist文件中。

 NSAppTransportSecurity  NSAllowsArbitraryLoads  

应用程序传输安全(ATS)在应用程序及其后端之间的安全连接中实施最佳实践。 ATS防止意外泄露,提供安全的默认行为,并且易于采用; 它在iOS 9和OS X v10.11中默认启用。 无论您是在创建新应用程序还是更新现有应用程序,都应尽快采用ATS。

如果您正在开发新的应用程序,则应该专门使用HTTPS。 如果您有现有应用,则应尽可能多地使用HTTPS,并创建一个计划,以便尽快迁移其余应用。 此外,您通过更高级别的API进行的通信需要使用具有前向保密性的TLS 1.2版进行加密。 如果尝试建立不符合此要求的连接,则会引发错误。 如果您的应用需要向不安全的域发出请求,则必须在应用的Info.plist文件中指定此域。

对我而言,它是@ area28和@Sithys的答案的组合。 所以我最后将它添加到我的info.plist:

  NSAppTransportSecurity  NSAllowsArbitraryLoads  NSExceptionDomains  example.domain.com  NSIncludesSubdomains  NSTemporaryExceptionAllowsInsecureHTTPLoads  NSTemporaryExceptionMinimumTLSVersion TLSv1.1    

对于那些将来会遇到这种情况的人。 我遇到了同样的问题,结果certificateSSL证书是自签名的(开发服务器)。 iOS 9 Cordova(UIWebView – 不确定WKWebView)将无提示失败并返回readyState:0,responseText:“”,状态:0

Android 7没有这个问题。