使用带有离子和电容器的 https 加载 webview

Posted

技术标签:

【中文标题】使用带有离子和电容器的 https 加载 webview【英文标题】:Loading webview with https with ionic and capacitor 【发布时间】: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 标志工作? 【参考方案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 标志,我无法使其工作并且在文档中没有看到它

以上是关于使用带有离子和电容器的 https 加载 webview的主要内容,如果未能解决你的问题,请参考以下文章

当我处于生产模式时,图像不会加载到离子电容器中,但它处于开发模式

离子/电容器 - PushNotiifcations - Android - “通知” + “数据” 消息

离子与电容器在飞溅后去除白屏?

离子电容器 qrscanner 活动兼容性

离子电容器:如何将 ImagePicker 的类型更改为 Base64?

离子和电容器:如何将电容器.config.ts 文件更改为电容器.config.json 文件?