简体   繁体   English

为什么 jQuery Ajax 在 Cordova iOS 应用程序中不起作用

[英]Why is jQuery Ajax not working in Cordova iOS app

I am building a Cordova app that uses jQuery Ajax to upload images to our server.我正在构建一个 Cordova 应用程序,它使用 jQuery Ajax 将图像上传到我们的服务器。 The uploads were working for a while on both Android and iOS, then after a while they suddenly stopped working on iOS.上传在 Android 和 iOS 上工作了一段时间,然后过了一段时间他们突然停止在 iOS 上工作。 Now, after a few seconds of trying to access a website, the request fails and I get an error message, which isn't much help.现在,在尝试访问网站几秒钟后,请求失败并且我收到一条错误消息,这并没有多大帮助。 The error is like the following:错误如下:

readyState: 0
status: 0
statusText: "error"

My code is:我的代码是:

    $.ajax("http://testapi.com/api", {
        data: submission,
        processData: false,
        contentType: false,
        method: "POST",
        // submission was successful
        success(data) {
          if (JSON.parse(data).success) {
            // backend validated and accepted submission
          } else {
            // backend rejected submission due to validation errors
          }
        },
        // submission failed
        // eslint-disable-next-line no-unused-vars
        error(xhr, text, error) {
          alert(
            JSON.stringify(xhr) + "  " + text + " " + JSON.stringify(error)
          );
        }
      });

My Content Security Policy, in index.html is:我的内容安全策略,在 index.html 中是:

<meta http-equiv="Content-Security-Policy" content="default-src * blob: gap://* file: http: https: ; style-src 'self' 'unsafe-inline'; script-src * blob: file: 'unsafe-inline' 'unsafe-eval' http: https: ; img-src 'self' data: blob: file: ; media-src * blob: file:  http: https: ;"

And config.xml is: `而 config.xml 是:`

    <config-file parent="NSCameraUsageDescription" target="*-Info.plist">
        <string>World Bee Count needs access to your camera and photo library</string>
    </config-file>
    <edit-config file="*-Info.plist" overwrite="true" target="NSLocationWhenInUseUsageDescription">
        <string>need location access to find things nearby</string>
    </edit-config>
    <edit-config file="*-Info.plist" overwrite="true" target="NSLocationAlwaysAndWhenInUseUsageDescription">
        <string>need location access to find things nearby</string>
    </edit-config>
    <string file="*-Info.plist" overwrite="true" target="NSLocationAlwaysUsageDescription">
        <string>need location access to find things nearby</string>
    </string>
    <config-file parent="NSPhotoLibraryUsageDescription" target="*-Info.plist">
        <string>World Bee Count needs access to your camera and photo library</string>
    </config-file>
    <preference name="StatusBarOverlaysWebView" value="false" />
    <preference name="StatusBarBackgroundColor" value="#2D81C1" />
    <preference name="Fullscreen" value="true" />
    <feature name="CDVWKWebViewEngine">
        <param name="ios-package" value="CDVWKWebViewEngine" />
    </feature>
    <preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
    <preference name="WKWebViewOnly" value="true" />
</platform>
<engine name="ios" spec="5.1.0" />
<plugin name="cordova-plugin-geolocation" />
<plugin name="cordova-plugin-device" />
<plugin name="cordova-plugin-file" />
<plugin name="cordova-plugin-filepath" />
<plugin name="cordova-plugin-whitelist" />
<plugin name="cordova-plugin-add-swift-support" />
<plugin name="com.subitolabs.android.cordova.galleryapi" spec="https://github.com/Collaborne/cordova-gallery-api.git"></plugin>
<plugin name="cordova.plugins.diagnostic" />
<plugin name="cordova-plugin-android-permissions" />
<plugin name="cordova-plugin-splashscreen" source="npm" />
<plugin name="cordova-plugin-camera-preview"></plugin>
<plugin name="cordova-plugin-wkwebview-engine" spec="~1.2.1" />
<plugin name="cordova-plugin-screen-orientation" spec="~3.0.2" />`

<access origin="*" />
<allow-intent href="*" />
<allow-navigation href="*" />

I am running this on iOS 13 and using PhoneGap build我在 iOS 13 上运行它并使用 PhoneGap 构建

My problem is most similar to this Ajax Not working in IOS 9.0 Cordova我的问题与此Ajax Not working in IOS 9.0 Cordova最相似

I tried updating my config.xml according to this question But it doesn't seem to be working我尝试根据这个问题更新我的 config.xml 但它似乎不起作用

Any help is would be very much appreciated, I've been working on this for hours and can't seem to get anywhere任何帮助将不胜感激,我已经为此工作了几个小时,但似乎无处可去

OK, I found the problem was because of a recent update from UIWebView to WKWebView, which was breaking the Ajax code.好的,我发现问题是因为最近从 UIWebView 更新到 WKWebView,这破坏了 Ajax 代码。 I added thecordova-plugin-wkwebview-file-xhr plugin to my project as described in the documentation.如文档中所述,我将cordova-plugin-wkwebview-file-xhr插件添加到我的项目中。 I also removed the version spec on the WKWebView engine plugin.我还删除了 WKWebView 引擎插件的版本规范。 My config.xml was edited to include the following:我的 config.xml 被编辑为包括以下内容:

<plugin name="cordova-plugin-wkwebview-engine" />
<plugin name="cordova-plugin-wkwebview-file-xhr" spec="~2.1.4" />

And under而下

<platform name="ios">
....
<preference name="AllowUntrustedCerts" value="on" />
<preference name="InterceptRemoteRequests" value="all" />
<preference name="NativeXHRLogging" value="full" />

I tried various combinations of the preferences, but only this combination worked.我尝试了各种偏好组合,但只有这种组合有效。 However, NativeXHRLogging could be disabled as it didn't seem to matter.但是,可以禁用 NativeXHRLogging,因为它似乎并不重要。 After this everything started working once again在此之后,一切都再次开始工作

I had the same problem when building with Cordova IOS 6.1.1.在使用 Cordova IOS 6.1.1 构建时,我遇到了同样的问题。

I tried above solution but got build errors with -engine as mentioned.我尝试了上述解决方案,但如前所述,使用 -engine 生成错误。

I removed -engine and just used the latest file-xhr and it worked.我删除了 -engine 并且只使用了最新的 file-xhr 并且它有效。

Just use the following plugin, worked with or without the above mentioned preferences.只需使用以下插件,无论是否使用上述首选项。

<plugin name="cordova-plugin-wkwebview-file-xhr" source="npm" version="3.0.0" /> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM