使用带有离子和电容器的 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 - “通知” + “数据” 消息