我正在为Android开发一个Cordova应用程序,我有一个关于jquery ajax调用的奇怪问题:调试版本没有问题,而在发布版本中,每个ajax调用都会失败并出现错误。如果我使用USB在设备上运行一切都很好。如果我在调试模式下编译应用程序,将其复制并安装在设备上,一切都很好。
如果我在发布模式下编译应用程序并使用jarsigner和zipalign签名发布,并将其复制并安装在设备上,则相同的ajax调用将失败,其中readyState 0,responseText为空,状态为0,statusText为"错误"
我花了一周时间搜索并尝试在stackoverflow和google上发现的所有类似问题,但没有任何改变。 此主题主题类似,但我的SSL证书似乎没问题,并且没有提供其他解决方案: Ajax calls fail when running Android Cordova app in Release mode
Cordova版本是6.5(但我也有6.4中的问题)。
这是app中的ajax调用:
glang = window.localStorage.getItem('glang');
show_loader();
$.support.cors=true;
$.ajax({
url: "https://app.laureatedesign.com/wp-content/plugins/designnews/ajax_langs.php",
data: "act=aj_app_lng_lst&lang="+glang+"&xend=x",
type: "POST",
dataType: "json",
timeout: 10000,
success: function(results) {
if (results["TYPE"]=="OK") {
$('#main').html(results["CONTENT"]);
$('#main').imagesLoaded( { },
function() {
show_content();
}
);
}
if (results["TYPE"]=="ERR") {
show_error();
}
},
error: function(XMLHttpRequest, status) {
console.log(status);
switch(status) {
default:
show_error();
break;
case "timeout":
show_error();
break;
}
}
});
无论如何,服务器上的ajax文件ajax_langs.php可以简化如下:
<?php
$res = array("TYPE"=>"OK", "CONTENT"=>"Test");
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
echo json_encode($res);
?>
这是我的config.xml:
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.naba.designnews" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>APPTITLE</name>
<description>
DESCRIPTION
</description>
<author email="EMAIL" href="WEBSITE">
AUTHOR
</author>
<content src="index.html" />
<plugin name="cordova-plugin-whitelist" spec="1" />
<plugin name="InAppBrowser" value="org.apache.cordova.InAppBrowser" />
<plugin name="InAppBrowser" value="CDVInAppBrowser" />
<allow-navigation href="*" />
<allow-navigation href="*://*youtube.com" />
<access origin="*" />
<access origin=".*" />
<access origin="*.pushwoosh.com" />
<access origin="http://*" />
<access origin="https://*" />
<access origin="https://laureatedesign.com" subdomains="true" />
<allow-intent href="http://*" />
<allow-intent href="https://*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<preference name="windows-target-version" value="10.0" />
<preference name="StatusBarOverlaysWebView" value="false" />
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
</widget>
我添加了白名单插件。 在index.html文件中,我有这个元:
<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:">
我还试图删除android平台并再次添加它。没有变化。
正如我在调试模式中说的一切都很好,所有ajax调用都成功返回。要在Google Play上发布应用程序,我正在按照以下步骤签署并创建该程序包:
1)cordova build android --release
2)jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore&#34; PATH-TO-APP / APP.keystore&#34; &#34; PATH-TO-APP /平台/机器人/建造/输出/ APK /机器人释放-unsigned.apk&#34; designnews
3)zipalign -v 4&#34; PATH-TO-APP / platforms / android / build / outputs / apk / android-release-unsigned.apk&#34; &#34; PATH-TO-APP /平台/机器人/建造/输出/ APK / AppTitle.apk&#34;
我知道这是一个涉及CORS和所有这些内容的跨域调用。但是为什么调试版本没问题而发行版不是?
请提前帮助,谢谢。
答案 0 :(得分:1)
我知道这是一个已有3年历史的问题,但经过深入搜索后找到了解决方案,我想与大家分享。
与您报告的问题相同,解决方案非常简单;
1º-您需要运行“ cordova prepare android”才能获取Java二进制文件。
2º-在Android Studio上打开输出该命令的代码,在文件夹manifest / AndroidManifest.xml上导航
3º-有一个名为“应用程序”的应用,您只需添加android:usesCleartextTraffic =“ true”
4º-构建并签名您的应用程序,现在它应该可以运行ajax了!