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没有这个问题。