Ajax 在 IOS 9.0 Cordova 中不工作
Posted
技术标签:
【中文标题】Ajax 在 IOS 9.0 Cordova 中不工作【英文标题】:Ajax Not working in IOS 9.0 Cordova 【发布时间】:2015-09-22 00:43:10 【问题描述】:$.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: *');
【问题讨论】:
【参考方案1】:据我了解整个 ATS(App Transport Security - iOS 9),area28 推荐的方法不应该是您在应用程序中使用的方法。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
这将允许对每个域的所有外部请求绝对不是您应该使用的方式。在我看来,您应该在 info.plist
中定义一个新的 <dict>
并将此代码添加到其中(要编辑 info.plist
,您可以使用普通的文本编辑器,如 sublime text 等):
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>domain.tld</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
这将只允许对您指定的域的请求。所描述的方式是苹果introduced on the WWDC 2015 的方式。正如您在屏幕截图中看到的那样,这是苹果希望用户使用它的方式。
如果你没有指定任何东西,你会得到
无法加载网页并出现错误:无法加载资源 因为应用传输安全策略需要使用安全的 连接。
所以,像我说的那样改变它,错误就消失了。
【讨论】:
我同意。两者都可以,如果需要,您可以更具体。 不是你可以,你应该更具体!这些是我认为不可讨论的安全主题。 第二种将每个域列入白名单的方法绝对是可行的方法,第一种方法在 iOS9 之前的 iOS 中不起作用。 (在 iOS 7 上测试) 我面临着几乎同样的问题。我尝试使用上述设置。相同的应用程序在我们的 QA 服务器中运行良好。但是当我尝试连接到开发服务器时,它不起作用。它返回 "readyState":0,"status":0,"statusText":"Error: NETWORK_ERR: XMLHttpRequest Exception 101"【参考方案2】:如果您在 Xcode 项目中工作,您可能需要编辑 info.plist
文件。 iOS9 改变了安全性。 Apple 强烈建议尽可能使用 https 进行 Web 请求。 Here 是与此问题相关的答案。
来自那个帖子:
将此添加到您的 info.plist 文件中。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
应用传输安全 (ATS) 在应用与其后端之间的安全连接中强制执行最佳实践。 ATS 可防止意外泄露,提供安全的默认行为,并且易于采用;它在 iOS 9 和 OS X v10.11 中也默认开启。无论您是创建新应用还是更新现有应用,都应尽快采用 ATS。
如果您正在开发新应用,则应仅使用 HTTPS。如果您有一个现有的应用程序,您现在应该尽可能多地使用 HTTPS,并制定一个计划以尽快迁移您的应用程序的其余部分。此外,您通过更高级别 API 进行的通信需要使用具有前向保密性的 TLS 1.2 版进行加密。如果您尝试建立不符合此要求的连接,则会引发错误。如果您的应用需要向不安全的域发出请求,您必须在应用的 Info.plist 文件中指定该域。
【讨论】:
这对我有用。将设备更新到 iOS9 后,我的应用程序没有加载,现在它就像一个魅力。救生员,谢谢!【参考方案3】:对我来说,这是@area28 和@Sithys 的答案的结合。所以我最终将它添加到我的 info.plist 中:
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>example.domain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
【讨论】:
【参考方案4】:对于那些将来可能会遇到这种情况的人。我遇到了同样的问题,结果证明是由于 SSL 证书是自签名的(开发服务器)。 iOS 9 Cordova(UIWebView - 不确定 WKWebView)会静默失败并返回 readyState:0, responseText:"", status:0
android 7 没有这个问题。
【讨论】:
以上是关于Ajax 在 IOS 9.0 Cordova 中不工作的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IOS 7 的 cordova 2.9.0 中删除状态栏?
Phonegap (Cordova 2.9.0) iOS 上的地理定位
将 cordova 1.9.0 (iOS) 升级到 cordova 2.1.0 并更新现有项目以使用 2.1.0
Katzer 电子邮件插件在 Cordova 中不起作用 - IOS