为什么Cordova 6中CordovaWebViewClient不再起作用

5

我编写了一个自定义的webviewclient类,覆盖了cordova 3.7中的onPageStarted, onPageFinished等方法,这个功能一直运作良好。

下面的代码中,我将www目录托管到Web服务器上,并从那里与cordova插件进行交互(例如条形码扫描器、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等无法解析符号。我也尝试过CordovaWebViewImpl,但是让自己感到困惑。

在谷歌上搜索了很多之后,我发现大部分解决方案都是在2011-2014年提供的,现在已经不适用了。我没有找到cordova文档有用的地方。

3个回答

9

它被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重定向时会调用浏览器而不是应用程序。 - mumair
你的config.xml文件中是否有针对http/https的allow-intent标签?请将其删除。 - jcesarmobile
抱歉,我昨晚不在。在去除允许意图重定向后,重定向无法工作。 - mumair
1
然后,不要删除allow-intent,而是将它们替换为allow-navigation。 - jcesarmobile

1

Apache Cordova为了支持Crosswalk等外部Web视图,移除了CordovaWebViewClient。如果你查看以下提交链接中的14个更改文件链接,你会发现CordovaWebViewClient被删除,而AndroidWebViewClient被添加。

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

你可以尝试使用org.apache.cordova.engine.SystemWebViewClient代替。

实际上,相同的问题在这里得到了解答,并且也被接受。所以我相信这是解决问题的可能方案。希望能有所帮助。


1

Cordova 4移除了CordovaWebViewClient看这里

您可以使用WebViewClient代替CordovaWebViewClientcordova-plugin-inappbrowser插件用于重写onPageStarted事件)。

public class CustomCordovaWebViewClient extends WebViewClient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接