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 中定义一个新的 &lt;dict&gt; 并将此代码添加到其中(要编辑 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

Phonegap / Cordova 在 ios8 中不起作用

Ionic Cordova inappbrowser 在 iOS 中不起作用