【问题标题】:Loading webview with https with ionic and capacitor使用带有离子和电容器的 https 加载 webview
【发布时间】:2019-09-02 23:30:25
【问题描述】:

我正在尝试构建一个 apk,它必须使用带有离子 4 和电容器的 https://mydomain 加载。 在电容器.config.json 我精确这个领域:

"server" : {
  "hostname": "mydomain"    
}

因为我在该域中进行了一些 API 调用。 问题是,我希望我的应用程序在运行应用程序时以调试或 apk 模式加载 https://mydomain

我什至尝试在电容器.config.json 中这样做

"server" : {
  "hostname": "https://mydomain"    
}

但它只是做了这个调用

 http://https://mydomain

当我运行应用程序时。所以它只是继续在主机名中添加“http://”。

您知道我可以做些什么来让我的应用程序使用 https 而不是 http 运行吗?

我正在使用 ionic 4 和电容器,目前我正在使用 Android Studio 在 Android 平台上测试所有这些(但我将在 IOS 上使用相同的)。

谢谢

【问题讨论】:

  • 有什么好运的吗?
  • 有 --https 标志。这绝对可以为设备提供 https。然后我得到网络/ssl 握手错误和一个空白的应用程序屏幕。可能需要添加 CA 证书或其他东西。我仍然没有可行的解决方案:-(
  • @mcmonkeys1 你有没有让--https 标志工作?

标签: android ionic-framework https webview capacitor


【解决方案1】:

Ionic 确实有一个实验性的 --ssl 标志

https://ionicframework.com/docs/cli/commands/serve

这里有跟踪它的问题:

https://github.com/ionic-team/ionic-cli/issues/3305

【讨论】:

    【解决方案2】:

    使用电容器.config.json 中的以下内容:

    {
      "hostname": "mydomain.com",
      "androidScheme": "https"
    }
    

    【讨论】:

      【解决方案3】:

      Capacitor github上有一个可行的解决方案https://github.com/ionic-team/capacitor/issues/3707#issuecomment-713360155

      重要提示:这应该仅用于调试,如果您将此代码留在生产版本中,您的应用可能会被拒绝。该代码会忽略 SSL 错误,因此不应出现在任何实时代码中。

      对于 Capacitor v3,我导入这些行:

      import javax.net.ssl.HostnameVerifier;
      import javax.net.ssl.HttpsURLConnection;
      import javax.net.ssl.SSLContext;
      import javax.net.ssl.SSLSession;
      import javax.net.ssl.TrustManager;
      import javax.net.ssl.X509TrustManager;
      import java.security.cert.CertificateException;
      import java.security.cert.X509Certificate;
      

      然后在我的应用的 MainActivity.java 中为 onStart() 添加一个覆盖

      @Override
      public void onStart() {
      super.onStart();
      
      if (BuildConfig.DEBUG) {
        this.bridge.getWebView().setWebViewClient(new BridgeWebViewClient(this.bridge) {
          @Override
          public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
            handler.proceed();
          }
        });
      
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
          public X509Certificate[] getAcceptedIssuers() {
            return null;
          }
      
          @Override
          public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
            // Not implemented
          }
      
          @Override
          public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
            // Not implemented
          }
        }};
      
        try {
          SSLContext sc = SSLContext.getInstance("TLS");
      
          sc.init(null, trustAllCerts, new java.security.SecureRandom());
      
          HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
          HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } });
        } catch (KeyManagementException e) {
          e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
          e.printStackTrace();
        }
      }
      

      对于 Capacitor v2,这可能有效 - 但如果不能,则可以将代码从 onStart() 移动到 onCreate(Bundle savedInstanceState) ,我在升级到 v3 之前看到它在其中工作。

      我从 CLI 运行它

      ionic capacitor run android -l --host=0.0.0.0 --consolelogs --external --ssl
      

      【讨论】:

      • 似乎 Capacitor 团队已从实时/热重载模式中删除了 --ssl 标志,我无法使其工作并且在文档中没有看到它
      猜你喜欢
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2023-03-04
      • 1970-01-01
      • 2022-08-14
      • 2020-04-26
      相关资源
      最近更新 更多