【问题标题】:Ionic 5/Capacitor ERR_CLEARTEXT_NOT_PERMITTED in AndroidAndroid 中的离子 5/电容器 ERR_CLEARTEXT_NOT_PERMITTED
【发布时间】:2020-07-09 10:17:48
【问题描述】:

我正在使用 Capacitor 来构建 Ionic 应用程序。这些是为了在 Android Studio 中打开 android 应用而运行的以下命令。

npx cap add android
ionic build
npx cap copy
npx cap open android

在 Android Studio 中,我运行构建并单击运行,之后我在设备中看到错误 net::ERR_CLEARTEXT_NOT_PERMITTED。我看到各种帖子都有相同的错误,但那些都是Cordova build。就我而言,我没有使用 Cordova 来准备 Android 应用程序。

以下是我的 Ionic 应用程序的一些摘录。

capacitor.config.jsonfile

{
  "appId": "com.abc",
  "appName": "abc",
  "bundledWebRuntime": false,
  "npmClient": "npm",
  "webDir": "www",
  "cordova": {
    "preferences": {
      "ScrollEnabled": "false",
      "android-minSdkVersion": "19",
      "BackupWebStorage": "none",
      "SplashMaintainAspectRatio": "true",
      "FadeSplashScreenDuration": "0",
      "SplashShowOnlyFirstTime": "false",
      "SplashScreen": "none",
      "SplashScreenDelay": "0"
    }
  },
  "server": {
    "url": "http://192.168.1.208:8100"
  }
}

我在 Android Studio 的 LogCat 中也看到了这个错误

W/cr_AwContents: Application attempted to call on a destroyed WebView
    java.lang.Throwable
        at org.chromium.android_webview.AwContents.a(PG:127)
        at org.chromium.android_webview.AwContents.a(PG:209)
        at com.android.webview.chromium.WebViewChromium.evaluateJavaScript(PG:8)
        at android.webkit.WebView.evaluateJavascript(WebView.java:1113)
        at com.getcapacitor.cordova.MockCordovaWebViewImpl$1.run(MockCordovaWebViewImpl.java:203)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6923)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)

【问题讨论】:

    标签: android ionic-framework capacitor ionic5


    【解决方案1】:

    application 元素中添加这个AndroidManifest.xml

    <application
        android:usesCleartextTraffic="true"
    

    【讨论】:

    • 这对我不起作用。一旦我添加了这个语句,它就会在设备中给出ERR_CONNECTION_REFUSED 错误。
    • 我认为这是正确的做法,因为它符合电容器的一次编码,到处配置的理念
    • 我被告知要来这里为我的问题 (stackoverflow.com/questions/67602933/…) 找到解决方案,但它也没有帮助我。
    • 谢谢。有没有办法只为本地开发案例启用此功能?
    【解决方案2】:

    当您在 Capacitor 配置中指定 server 时,应将 server.cleartext 设置为 true 以防止发生此问题。示例:

    {
      "appId": "com.abc",
      "appName": "abc",
      "npmClient": "npm",
      "server": {
        "url": "http://192.168.1.208:8100", 
        "cleartext": true
      }
    }
    

    这没有很好的记录——我发现这个配置被使用的唯一地方是https://capacitorjs.com/docs/guides/live-reload

    【讨论】:

    • 没有帮助!现在白屏需要很长时间,然后抛出ERR_CONNECTION_TIMED_OUT
    【解决方案3】:

    这个post 帮助我找到了解决问题的方法。

    我删除了 capacitor.config.json 文件中的 server 字段以使其正常工作。

    "server": {
        "url": "http://localhost:8100"
    }
    

    现在我的 capacitor.config.json 看起来像

    {
      "appId": "com.abc",
      "appName": "abc",
      "bundledWebRuntime": false,
      "npmClient": "npm",
      "webDir": "www",
      "cordova": {
        "preferences": {
          "ScrollEnabled": "false",
          "android-minSdkVersion": "19",
          "BackupWebStorage": "none",
          "SplashMaintainAspectRatio": "true",
          "FadeSplashScreenDuration": "0",
          "SplashShowOnlyFirstTime": "false",
          "SplashScreen": "none",
          "SplashScreenDelay": "0"
        }
      }
    }
    

    【讨论】:

    • 所做的只是关闭实时重新加载,这就是您的应用开始工作的原因
    • 我根本没有使用 livereload 来运行我的应用程序。不知何故,server 行被添加到capacitor.config.json 文件中,当我删除该字段时,我的应用程序开始在设备和模拟器中运行。我不必在 manifest.xml 中使用任何 android:usesCleartextTraffic 属性
    • @coderpc 是对的。发生在我身上。从一秒钟到另一秒钟,我自己没有改变,这条线也被添加了,没有任何效果了。删除它,现在一切正常。谢谢
    【解决方案4】:

    您可以通过在 capacitor.config 文件中启用 cleartext 流量来允许 Web 视图中的流量,方法是添加以下代码

    server: {
      cleartext: true
    }
    

    构建您的项目以查看更改

    ionic capacitor build android
    

    【讨论】:

    • 表演节目,谢谢
    【解决方案5】:

    将此代码添加到capacitor.config中: 服务器: { 明文:真 }

    【讨论】:

    • 表演节目,谢谢
    【解决方案6】:

    只需运行此命令:

    ionic capacitor run android -l --ssl
    

    【讨论】:

      【解决方案7】:

      虽然上述解决方案可能有效,但也值得检查您的网络资产是否已正确复制到 android/app/src/main 目录,因为缺少 index.html 会引发相同的 net::ERR_CLEARTEXT_NOT_PERMITTED 错误。

      在某些情况下,例如当cap sync无法删除之前的assets目录时,文件没有被正确复制,但是进程没有错误退出。

      【讨论】:

        【解决方案8】:

        这对我有用: https://www.basezap.com/fix-leartext-error-for-websites/

        在 app/manifests/AndroidManifest.xml 编辑应用标签添加 android:usesCleartextTraffic="true" 属性

        【讨论】:

          【解决方案9】:

          进入capacitor.config.json 并添加cleartext: true 属性:

          "server": {
            "cleartext": true
          }
          

          然后,运行npx cap copy,启动服务器,重新编译并再次从您的IDE(Xcode/AndroidStudio)运行项目。

          【讨论】:

            猜你喜欢
            • 2020-07-24
            • 2022-01-18
            • 2022-01-22
            • 1970-01-01
            • 2022-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多