JSBridge
混合移动开发中 JS 与宿主通信的一种方式
安卓
public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); }}// 添加js接口 一个名为Android的全局对象webview.addJavascriptInterface(new WebAppInterface(this), "Android");
宿主调用js:
// 执行一段js脚本 可以获取到脚本的返回参数webView.evaluateJavascript("alert('hello world')", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { }});// 加载url的同时传递参数webView.loadUrl("schema://url?params");
if(typeof Android !== "undefined" && Android !== null) { Android.showToast(toast);} else { alert("Not viewing in webview");}
IOS
// name为唯一标识 postMessage方法会发送一条数据到宿主function postMessage(name, message) { window.webkit.messageHandlers[name].postMessage(message);}
定义一个实现 WKScriptMessageHandler
协议的类
class DocImgBridge: NSObject, WKScriptMessageHandler { let onImgClick: (String, String) -> () init(callback: @escaping (String, String) -> () = {_,_ in ()}) { self.onImgClick = callback } // 这个方法在JS postMessage方法被调用后调用 会将message传递过来 在这里做具体的业务处理 public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { guard let body = message.body as? [String: Any] else { return } debugPrint(body) onImgClick(body["src"] as? String ?? "", body["name"] as? String ?? "") }}
注册:
webview.configuration.userContentController.add(bridge, name: bridgeName)
宿主调用js:
webview.evaluateJavaScript("script", completionHandler: <#T##((Any?, Error?) -> Void)?##((Any?, Error?) -> Void)?##(Any?, Error?) -> Void#>)(<#T##javaScriptString: String##String#>)