Ajax Call 无法在 android 上运行,但在 ios Cordova 上运行良好

Posted

技术标签:

【中文标题】Ajax Call 无法在 android 上运行,但在 ios Cordova 上运行良好【英文标题】:Ajax Call not working on android But working fine on ios Cordova 【发布时间】:2016-11-04 23:24:44 【问题描述】:

编辑:当然服务器端很好,因为 ajax 在 ios 和浏览器上做得很好 => 允许跨源请求


我正在开发一个 Cordova 移动应用程序。我为 android 和 ios 构建了应用程序,但 android 应用程序不起作用并且 dnt 发送 ajax 请求。同时 Ios 应用程序正常工作。这是我的 config.xml .....

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.unitedway" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">
    <name>fw3</name>
    <description>Hello World sample application that responds to the deviceready event.</description>
    <author email="support@phonegap.com" href="http://phonegap.com">PhoneGap Team</author>
    <content src="index.html" />
    <preference name="AndroidPersistentFileLocation" value="Internal" />
    <preference name="AndroidPersistentFileLocation" value="Compatibility" />
    <preference name="iosPersistentFileLocation" value="Documents" />
    <preference name="iosPersistentFileLocation" value="Compatibility" />
    <preference name="permissions" value="none" />
    <preference name="orientation" value="default" />
    <preference name="target-device" value="universal" />
    <preference name="fullscreen" value="true" />
    <preference name="webviewbounce" value="true" />
    <preference name="prerendered-icon" value="true" />
    <preference name="stay-in-webview" value="false" />
    <preference name="ios-statusbarstyle" value="black-opaque" />
    <preference name="detect-data-types" value="true" />
    <preference name="exit-on-suspend" value="false" />
    <preference name="show-splash-screen-spinner" value="true" />
    <preference name="auto-hide-splash-screen" value="true" />
    <preference name="disable-cursor" value="false" />
    <preference name="android-minSdkVersion" value="14" />
    <preference name="WebSecurity" value="disable" />
    <preference name="android-installLocation" value="auto" />
    <gap:plugin name="org.apache.cordova.battery-status" />
    <gap:plugin name="org.apache.cordova.camera" />
    <gap:plugin name="org.apache.cordova.media-capture" />
    <gap:plugin name="org.apache.cordova.console" />
    <gap:plugin name="org.apache.cordova.contacts" />
    <gap:plugin name="org.apache.cordova.device" />
    <gap:plugin name="org.apache.cordova.device-motion" />
    <gap:plugin name="org.apache.cordova.device-orientation" />
    <gap:plugin name="org.apache.cordova.dialogs" />
    <gap:plugin name="org.apache.cordova.file" />
    <gap:plugin name="org.apache.cordova.file-transfer" />
    <gap:plugin name="org.apache.cordova.geolocation" />
    <gap:plugin name="org.apache.cordova.globalization" />
    <gap:plugin name="org.apache.cordova.inappbrowser" />
    <gap:plugin name="org.apache.cordova.media" />
    <gap:plugin name="org.apache.cordova.network-information" />
    <gap:plugin name="org.apache.cordova.splashscreen" />
    <gap:plugin name="org.apache.cordova.vibration" />
    <icon src="icon.png" />
    <icon gap:platform="android" gap:qualifier="ldpi" src="www/res/icon/android/icon-36-ldpi.png" />
    <icon gap:platform="android" gap:qualifier="mdpi" src="www/res/icon/android/icon-48-mdpi.png" />
    <icon gap:platform="android" gap:qualifier="hdpi" src="www/res/icon/android/icon-72-hdpi.png" />
    <icon gap:platform="android" gap:qualifier="xhdpi" src="www/res/icon/android/icon-96-xhdpi.png" />
    <icon gap:platform="blackberry" src="www/res/icon/blackberry/icon-80.png" />
    <icon gap:platform="blackberry" gap:state="hover" src="www/res/icon/blackberry/icon-80.png" />
    <icon gap:platform="ios"  src="www/res/icon/ios/icon-57.png"  />
    <icon gap:platform="ios"  src="www/res/icon/ios/icon-72.png"  />
    <icon gap:platform="ios"  src="www/res/icon/ios/icon-57-2x.png"  />
    <icon gap:platform="ios"  src="www/res/icon/ios/icon-72-2x.png"  />
    <icon gap:platform="webos" src="www/res/icon/webos/icon-64.png" />
    <icon gap:platform="winphone" src="www/res/icon/windows-phone/icon-48.png" />
    <icon gap:platform="winphone" gap:role="background" src="www/res/icon/windows-phone/icon-173-tile.png" />
    <gap:splash gap:platform="android" gap:qualifier="port-ldpi" src="www/res/screen/android/screen-ldpi-portrait.png" />
    <gap:splash gap:platform="android" gap:qualifier="port-mdpi" src="www/res/screen/android/screen-mdpi-portrait.png" />
    <gap:splash gap:platform="android" gap:qualifier="port-hdpi" src="www/res/screen/android/screen-hdpi-portrait.png" />
    <gap:splash gap:platform="android" gap:qualifier="port-xhdpi" src="www/res/screen/android/screen-xhdpi-portrait.png" />
    <gap:splash gap:platform="blackberry" src="www/res/screen/blackberry/screen-225.png" />
    <gap:splash gap:platform="ios"  src="www/res/screen/ios/screen-iphone-portrait.png"  />
    <gap:splash gap:platform="ios"  src="www/res/screen/ios/screen-iphone-portrait-2x.png"  />
    <gap:splash gap:platform="ios"  src="www/res/screen/ios/screen-iphone-portrait-568h-2x.png"  />
    <gap:splash gap:platform="ios"  src="www/res/screen/ios/screen-ipad-portrait.png"  />
    <gap:splash gap:platform="ios"  src="www/res/screen/ios/screen-ipad-landscape.png"  />
    <gap:splash gap:platform="winphone" src="www/res/screen/windows-phone/screen-portrait.jpg" />
    <allow-navigation href="*" />
    <allow-intent href="*" />
    <access origin="*" subdomains="true" />
    <platform name="android">
        <allow-navigation href="*" />
        <allow-intent href="*" />
    </platform>
    <platform name="ios">
        <allow-navigation href="*" />
        <allow-intent href="*" />
    </platform>
    <engine name="android" spec="~4.1.1" />
    <engine name="ios" spec="~4.1.1" />
    <plugin name="io.phasr.cordova.plugin.itunesfilesharing" spec="https://github.com/christianjunk/cordova-plugin-itunesfilesharing" />
    <plugin name="cordova-plugin-file" spec="~4.2.0" />
    <plugin name="cordova-plugin-whitelist" spec="~1.2.2" />
</widget>

这是我的安卓 AndroidManifest

<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="com.unitedway" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" android:supportsRtl="true">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="23" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

我的 ajax 请求代码返回状态 404。

所以 ajax 请求在 android 上失败,但在 ios 和浏览器上工作正常。

【问题讨论】:

上面的代码很好,你是否允许从你想要触发ajax的服务器。有一个概念 跨域资源共享 ,您必须允许从您的应用程序从服务器端获取请求到服务器。通过它了解更多信息w3.org/TR/cors @Hassan 尝试在 config.XML 中为 android 平台添加以下内容 - @Gandhi 我读过&lt;allow-intent href="*" /&gt; 应该和他们一样做 @AnantaPrasadLoda 是的。查看我的编辑(在顶部).. 允许来自服务器的跨源请求 这是来自应用程序,我是说您必须在服务器端 @Sami 先生允许跨源 【参考方案1】:

我下载了您的项目,在我新创建的项目中替换了您的项目源代码,并将删除按钮单击功能的 AJAX url 调用替换为我的本地 URL,我可以成功地进行 AJAX 调用。事实上,我已经在成功回调中设置了一个警报,我也得到了警报。

所以无论如何它与编码无关。这可能是首先创建 Android 平台的问题,或者可能是科尔多瓦白名单插件安装的问题。

已在github 中发布了工作代码库,还包括插件和Android 平台供您参考以及代码库。一定要利用它进行进一步的开发。希望对您有所帮助。

【讨论】:

@HassanALi 我很谦虚。很高兴这很有帮助。快乐编码。等待赏金 :) 干杯 @Sami 谢谢萨米。很高兴我能帮助你们。希望我们能很快就其他问题见面。快乐编码【参考方案2】:

从第 5 版左右开始,cordova 需要 whitelist plugin。然后&lt;access origin="*" /&gt;(或您选择的任何来源)应该可以工作。

【讨论】:

请检查我的 config.xml 我已经安装了白名单插件并且还添加了这个 。但它仍然不能仅在 android 上工作。 我没有注意到,因为它在列表中。对我来说,它完成了这项工作。请求是否到达服务器?就我而言,它们甚至不是由设备发送的。但如果白名单不是解决方案,我不知道它会是什么。

以上是关于Ajax Call 无法在 android 上运行,但在 ios Cordova 上运行良好的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 AJAX Post Call上没有消息异常。第203行,Handler.php,419未知状态

Angular Onsen UI Ajax call

无法在 Jquery ajax 调用中发送大数据

每次 Ajax 调用(之前和之后)的 Javascript

Asp .Net Core 2.2 Razor Pages Ajax Call Post 不工作

无法从 ajax 帖子中“调用”控制器操作