【问题标题】:Ajax Not working in IOS 9.0 CordovaAjax 在 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: *');

【问题讨论】:

    标签: jquery ajax cordova


    【解决方案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 没有这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 2018-11-28
        • 1970-01-01
        • 2016-12-20
        • 2021-08-11
        • 2017-09-17
        • 2016-06-12
        相关资源
        最近更新 更多