猿问

Cordova - Android 上的 XHR 请求在模拟器中工作,但在手机上不工作

所以我有一个现有的应用程序已经在应用程序商店上架了很长一段时间,截至 3 天前,我收到更多支持查询,说我的应用程序无法连接到我的服务。


现在,它终于在我的 Android 设备上发生了——一切都适用于 iOS,适用于模拟器上的 Android——但在现实世界中却一无所获。


我已经尽我所能地使用 Cordova 进行逐步调试,它很好地通过了白名单测试。我的第一个 XHR 请求工作正常,但后续请求总是失败,直到我完全关闭应用程序并重新打开。


我正在使用cordova-plugin-whitelist@1.3.4- 我也试过cordova-plugin-whitelist@1.0.0


我的Content-Security-Policy长相是这样的


<meta http-equiv="Content-Security-Policy" content="default-src * 'self' gap:; img-src http://*.my-site.com.au https://*.my-site.com.au https://*.my-site.com http://*.my-site.com https://*.googleusercontent.com http://*.googleapis.com  https://google.com https://*.google.com https://*.googleapis.com https://*.gstatic.com 'self' data:; style-src http://*.googleapis.com https://*.googleapis.com 'self' 'unsafe-inline'; script-src 'self' https://*.googleapis.com http://*.googleapis.com http://maps.google.com http://*.gstatic.com https://*.gstatic.com https://maps.google.com 'unsafe-inline' 'unsafe-eval'">

我的科尔多瓦配置有


<allow-navigation href="*" />

<allow-navigation href="http://*/*" />

<allow-navigation href="https://*/*" />

我试过添加/删除/替换上面/每个组合<access origin="*" />但没有运气。


我的 XHR 响应总是如下所示


xhr.responseUrl = "http://my-site.com/?d=12343902i49"

xhr.status = 0

xhr.responseText = ""

我已经尽可能地在 Cordova 插件中逐步调试了 XHR 请求,通过逐步调试Whitelist.java但一切都返回正常并且它成功地进入了行


// If we don't need to special-case the request, let the browser load it.

return null;

功能的


WebResourceResponse shouldInterceptRequest(WebView view, String url)

在org.apache.cordova.engine.SystemWebViewClient.java



catspeake
浏览 250回答 4
4回答

红颜莎娜

如果降低 targetSDK,问题就会消失,这可能usesCleartextTraffic是 Nidhin Josehp 提到的问题。当目标为 SDK 28 或更高版本时,它只会影响 Android 8 或更新版本的设备。您可以将AndroidManifest.xml其添加到config.xml<platform name="android">&nbsp; <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">&nbsp; &nbsp; &nbsp; <application android:usesCleartextTraffic="true" />&nbsp; </edit-config></platform>您可能需要将小部件标签更改config.xml为如下所示:<widget id="com.your.app.id" version="1.0.0"xmlns="http://www.w3.org/ns/widgets"&nbsp;xmlns:android="http://schemas.android.com/apk/res/android"xmlns:cdv="http://cordova.apache.org/ns/1.0">(加法是xmlns:android="http://schemas.android.com/apk/res/android")

慕妹3242003

尝试添加android:usesCleartextTraffic="true"到<application>或AndroidManifest.xml如下使用config.xml<platform name="android">&nbsp; <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">&nbsp; &nbsp; &nbsp; <application android:usesCleartextTraffic="true" />&nbsp; </edit-config></platform>android:usesCleartextTraffic指示应用是否打算使用明文网络流量,例如明文 HTTP。针对 API 级别 27 或更低级别的应用程序的默认值为“true”。以 API 级别 28 或更高级别为目标的应用默认为“false”。更多信息明文是任何未加密或打算加密的传输或存储信息。当应用程序使用明文网络流量(例如 HTTP)与服务器通信时,它可能会增加窃听和篡改内容的风险,这就是为什么在最新的 Android 设备中,它被默认设置为false。

翻翻过去那场雪

我要跳,我发誓。<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="26" />将 targetSdkVersion 从 28 更改为 26。有效。但这将是一场噩梦。

侃侃尔雅

这是指由 Chrome 76 中引入的错误引起的与 CORS 相关的问题(基于相同版本的 WebKit 的 WebViews 受到影响也)。Chrome 76 于 2019 年 8 月开始推出。如果受影响的应用程序重新启动但随机返回,问题通常会消失。根据工单,该问题已在这几天推出的 Chrome 76.0.3809.111 中得到修复。在您的模拟器上,您可能使用的是旧版本的 Chrome,这可能是问题没有出现在那里的原因。如果您比较受影响和未受影响的设备,发现只有运行版本 >=76.0和 <的 Chrome 的设备76.0.3809.111显示症状,您可能找到了问题的原因。如果是这种情况,您至少有以下选择:等待 Chrome 的固定版本推出(许多受影响的手机可能已经出现这种情况)。如果您控制着服务器,则可以将file://来源添加到那里的允许来源列表中,这就是我们所做的。不过,您必须仔细考虑安全隐患。顺便说一句,在重新启动应用程序后,问题通常会消失,这使得调试变得困难。我们发现,它可以通过卸载并重新安装受影响的应用程序来重现。
随时随地看视频慕课网APP

相关分类

Java
我要回答