Cordova应用程序挂在iPhone 7上的ajax

Cordova应用程序挂在iPhone 7上的ajax

问题描述:

我使用Cordova的CLI来构建由HTML,CSS和JavaScript组成的移动应用程序。该应用程序使用jQuery 2.1.4,jQuery Mobile 1.4.5,并与Cordova 6.4.0一起打包。该应用程序正在针对Android 6.0.0和iOS 10.1进行打包。Cordova应用程序挂在iPhone 7上的ajax

我有一个问题,我所有的ajax调用都只挂在iPhone 7设备上。以下是我正在尝试的一种类型的Ajax调用的示例。

$.ajax({ 
    type: 'POST', 
    url: 'https://my.domain.com/myendpoint.php?parm=value', 
    beforeSend: function (request) { 
     request.setRequestHeader('Content-Type', 'application/json'); 
     request.setRequestHeader('Accept', 'application/json'); 
     request.setRequestHeader('Authorization', 'Basic ' + authstring); 
    } 
}) 

我无法对我的任何端点发出GET或POST请求,它们都只是无限期地挂起。当我将60秒的超时添加到请求时,超时将在60秒后触发我的失败功能。我尝试在启用了应用传输安全性的情况下点击HTTPS端点,并尝试禁用应用传输安全性的HTTP端点。无论我尝试什么,除非我包含超时,否则ajax将简单地挂起并永不失败或完成。

我已经测试了iPhone 5,iPhone 5C,iPhone 6和iPhone 6S上的应用程序,所有这些都在iOS 10.1.1上进行。这些不会挂起,并且ajax请求按预期完成。更奇怪的是,ajax请求也可以在XCode的iPhone 7模拟器中使用。但是,我的所有iPhone 7用户以及我的iPhone 7测试设备都经历了ajax无限期挂起的问题。

有关如何解决此问题的任何建议?

编辑:

我能得到它的工作通过添加meta标签:

<meta http-equiv="Content-Security-Policy" content="default-src * 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src * 'self' 'unsafe-inline'; script-src * 'self' 'unsafe-inline'; connect-src * https: http:"> 

我修改了科尔多瓦创建通过添加通配符所有值的元默认meta标签。我还将script-src和connect-src添加到标记中。我最初试用它们时没有使用通配符,但这并没有解决我的问题,所以我只是将通配符也包含在这两个键中,并且ajax请求开始工作。

编辑2:

作为一个侧面说明了其他人谁可能会遇到类似的问题,iOS设备也将导致Ajax请求无限期挂起,如果基本的身份验证标头使用无效的凭证发送给IIS服务器。当发送无效凭证时,IIS服务器默认配置为发回带有HTTP头“WWW-Authenticate”的401。如果设备收到此头文件,它不会将响应传递回应用层,这意味着您的失败功能永远不会触发。这似乎是iOS和Cordova应用程序的已知问题。在客户端避免这个问题的一种快速和肮脏的(尽管不是理想的)方法是将ajax请求设置为与ajax选项'async:false'同步。这将强制将响应返回给应用程序层,以便应用程序可以继续前进,这意味着您的错误功能将触发。如果你的所有ajax请求都需要基本的授权,这不会使你的应用程序有任何正义,但它至少可以帮助你诊断问题。

杰克你可以尝试添加这样的东西到您的信息。plist中

<key>NSAppTransportSecurity</key> 
 
<dict> 
 
    <key>NSExceptionDomains</key> 
 
    <dict> 
 
     <key>vimeo.com</key> 
 
     <dict> 
 
      <key>NSExceptionAllowsInsecureHTTPLoads</key> 
 
      <true/> 
 
      <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
 
      <true/> 
 
      <key>NSExceptionRequiresForwardSecrecy</key> 
 
      <false/> 
 
      <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> 
 
      <false/> 
 
      <key>NSIncludesSubdomains</key> 
 
      <true/> 
 
      <key>NSExceptionMinimumTLSVersion</key> 
 
      <string>TLSv1.0</string> 
 
      <key>NSRequiresCertificateTransparency</key> 
 
      <false/> 
 
     </dict> 
 
    </dict> 
 
</dict>

,你也可以尝试

<!-- Enable all requests, inline styles, and eval() --> 
 
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval';">

如果一切都失败了,你可以试试这个修复,这似乎如果你正在工作导致阿贾克斯失败的验证挑战

https://github.com/tripodsan/cordova-ios/commit/5f0133c026d6e21c93ab1ca0e146e125dfbe8f7e

,或者你可以试试这个插件科尔多瓦,允许HTTP请求 Click Here

最后一个链接解释修改安全策略,以及如何解决它。 Click Here