我从 Playstore 下载的应用无法调用 Web 服务

My App downloaded from the playstore fails to call web service

我最近开发了一个上传到 google play 商店的 cordova 应用程序。我在我的手机和模拟器上测试了这个应用程序数周,一切正常。但是,当我从 Playstore 下载相同的应用程序时,它无法调用任何网络服务,因此不会显示任何内容。

cordova : 9.0.1

npm : 6.10.1

cordova-android : 7.0.0

我已经检查了每一行代码,但我似乎找不到问题,我将对 window.localStorage 的每一次调用都替换为全局变量,以便能够修复我认为的问题问题。

<?xml version='1.0' encoding='utf-8'?></code>
<widget defaultlocale="en-US" id="com.test.fr" version="1.0.6" android-versionCode="100050" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:vs="http://schemas.microsoft.com/appx/2014/htmlapps">
    <content src="index.html" />
    <access origin="*" />
    <preference name="SplashScreen" value="screen" />
    <preference name="windows-target-version" value="8.1" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <platform name="android">
        <allow-intent href="market:*" />
    </platform>
    <platform name="ios">
        <allow-intent href="itms:*" />
        <allow-intent href="itms-apps:*" />
    </platform>
    <platform name="android">
        <icon src="www/res/icon/android/fr_mobile_icon.png" density="ldpi" />
        <icon src="www/res/icon/android/fr_mobile_icon.png" density="mdpi" />
        <icon src="www/res/icon/android/fr_mobile_icon.png" density="hdpi" />
        <icon src="www/res/icon/android/fr_mobile_icon.png" density="xhdpi" />
    </platform>
    <plugin name="cordova-plugin-device" version="2.0.2" />
    <plugin name="cordova-plugin-websql" version="0.0.10" />
    <plugin name="cordova-plugin-dialogs" version="2.0.1" />
    <plugin name="cordova-plugin-file" version="4.3.3" />
    <preference name="target-device" value="handset" />
    <preference name="BackupWebStorage" value="local" />
    <preference name="android-targetSdkVersion" value="28" />
    <preference name="android-minSdkVersion" value="17" />
    <preference name="android-maxSdkVersion" value="29" />
    <preference name="AndroidPersistentFileLocation" value="Compatibility" />
    <plugin name="cordova-custom-config" spec="5.1.0" />
</widget>

最糟糕的部分....设备上没有显示任何错误,它就是不起作用。

首先,你需要弄清楚这个错误的输出是什么。要允许对发布版本进行调试,请在 AndroiManifest.xml (https://developer.android.com/guide/topics/manifest/application-element) 的 application 标记上使用 android:debuggable

然后,将设备插入您的计算机并在开发设置(在您的设备上)中启用 usb debugging。然后,导航到 chrome://inspect/#devices - 您的设备应该会出现,并且将成为您的网络视图的 link。

打开检查器,执行请求并查看控制台选项卡上的错误。

我认为错误很可能是 CORS 错误,可能您的生产服务器启用了 CORS,然后您需要正确使用 cordova-plugin-whitelist 向服务器发送 origin,在此处阅读有关 cordova-plugin-whitelist 的更多信息:https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-whitelist/

尝试将 android:usesCleartextTraffic="true" 添加到 AndroidManifest.xml 中的 <application> 或如下使用 config.xml

<platform name="android">
  <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
      <application android:usesCleartextTraffic="true" />
  </edit-config>
</platform>

android:usesCleartextTraffic Indicates whether the app intends to use cleartext network traffic, such as cleartext HTTP. The default value for apps that target API level 27 or lower is "true". Apps that target API level 28 or higher default to "false". More info

Cleartext is any transmitted or stored information that is not encrypted or meant to be encrypted. When an app communicates with servers using a cleartext network traffic, such as HTTP, it could raise a risk of eavesdropping and tampering of content which is why in latest Android devices, it's set to false by default.