【问题标题】:Why CordovaWebViewClient not working in Cordova 6 anymore为什么 CordovaWebViewClient 不再在 Cordova 6 中工作
【发布时间】:2016-05-25 08:48:23
【问题描述】:

我已经编写了自定义 webviewclient 类来覆盖 Cordova 3.7 中的 onPageStarted, onPageFinished etc,它工作正常。

在下面的代码中,我已经将 www 目录托管到 Web 服务器并从那里交互科尔多瓦插件(条形码扫描仪、nfc、蓝牙等)。

public class MainActivity extends CordovaActivity {
    private WebView webView;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        super.init();

        loadUrl("https://example.com");
    }

    public class CustomCordovaWebViewClient extends CordovaWebViewClient {

        public CustomCordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
            super(cordova, view);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            Log.i("CSP Log", "onPageStarted: " + url);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.i("CSP Log", "onPageFinished: " + url);
        }

        @Override
        public void doUpdateVisitedHistory(WebView view, String url, boolean isReload){
            super.doUpdateVisitedHistory(view, url, isReload);
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
        }

    }

}

一年后,我将项目从cordova 3.7 迁移到cordova 6,但我发现上面的代码像CordovaWebViewClient, super.onPageStarted etc 一样损坏,无法解析符号。我也尝试了CordovaWebViewImpl 并让自己感到困惑。

在 google 上搜索了很多之后,我发现了大多数在 2011-14 年给出的解决方案,但不适用。我找不到 cordova 文档有帮助。

【问题讨论】:

    标签: android cordova android-webview


    【解决方案1】:

    替换为SystemWebViewClient

    你应该这样做:

    SystemWebView wv = (SystemWebView)appView.getView();
    wv.setWebViewClient(new SystemWebViewClient((SystemWebViewEngine)appView.getEngine()){
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            Log.i("CSP Log", "onPageStarted: " + url);
        }
    
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.i("CSP Log", "onPageFinished: " + url);
        }
    
        @Override
        public void doUpdateVisitedHistory(WebView view, String url, boolean isReload){
            super.doUpdateVisitedHistory(view, url, isReload);
        }
    
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
        }
    });
    

    【讨论】:

    • 我不知道为什么它在浏览器而不是应用程序中打开 url 重定向调用
    • 您的 config.xml 中有 http/https 的允许意图标签吗?删除它
    • 对不起,我晚上出去了。删除允许意图重定向后不起作用
    • 那么不要删除allow-intent,而是用allow-navigation替换它们
    【解决方案2】:

    Cordova 4 删除了 CordovaWebViewClient : look here

    您可以使用WebViewClient 代替CordovaWebViewClientcordova-plugin-inappbrowser 插件使用它来覆盖onPageStarted 事件)。

    public class CustomCordovaWebViewClient extends WebViewClient
    

    【讨论】:

      【解决方案3】:

      Apache cordova 移除了 CordovaWebViewClient 以支持 Crosswalk 等外部网络视图。如果您查看以下commit link 中的14 changed files 链接,您会看到 CordovaWebViewClient 已被删除,而 AndroidWebViewClient 已被添加。

      所以我猜你不能在 Cordova 6.0 中使用相同的旧代码工作

      您或许可以尝试改用org.apache.cordova.engine.SystemWebViewClient

      事实上,here 回答了同样的问题,并且也被接受了。所以我相信这是解决这个问题的可能方法。希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多