可能有些读者不知道webviewJavascriptBridge是啥,我先简单说一下。android和ios有时会需要与h5界面交互。如果不使用该框架,h5端需要写两套接口分别针对android和ios,使用该框架可以统一接口。
我借用的第三方版本网址:https://github.com/gzsll/WebViewJavascriptBridge
发现的问题:4.4以下registerHandler失效:
android端源码(其实就是原例子,为了看起来方便):
原因:自己用的时候,因为都是h5调用app,没有用到callHandler,所以删掉,结果4.4以下版本失效,所以此接口必须添加,可以不使用,同时网页端也添加相应设置。
package com.gzsll.webviewjavascriptbridge;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebView;
import android.widget.Toast;
import com.gzsll.jsbridge.WVJBWebView;
import com.gzsll.jsbridge.WVJBWebViewClient;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "WebViewJavascriptBridge";
private WVJBWebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WVJBWebView) findViewById(R.id.webView);
webView.loadUrl("file:///android_asset/ExampleApp.html");
webView.setWebViewClient(new CustomWebViewClient(webView));
findViewById(R.id.call).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.callHandler("testJavascriptHandler", "{\"greetingFromJava\": \"Hi there, JS!\" }", new WVJBWebView.WVJBResponseCallback() {
@Override
public void callback(Object data) {
Toast.makeText(MainActivity.this, "testJavascriptHandler responded: " + data, Toast.LENGTH_LONG).show();
}
});
}
});
webView.registerHandler("testJavaCallback", new WVJBWebView.WVJBHandler() {
@Override
public void request(Object data, WVJBWebView.WVJBResponseCallback callback) {
Toast.makeText(MainActivity.this, "testJavaCallback called:" + data, Toast.LENGTH_LONG).show();
callback.callback("Response from testJavaCallback!");
}
});
//此段必须
webView.callHandler("testJavascriptHandler", "{\"foo\":\"before ready\" }", new WVJBWebView.WVJBResponseCallback() {
@Override
public void callback(Object data) {
Toast.makeText(MainActivity.this, "Java call testJavascriptHandler got response! :" + data, Toast.LENGTH_LONG).show();
}
});
}
public class CustomWebViewClient extends WVJBWebViewClient {
public CustomWebViewClient(WVJBWebView webView) {
super(webView);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// do your work here
// ...
return super.shouldOverrideUrlLoading(view, url);
}
}
}