ssageFromNative(%s);";
private String mPort;
private WeakReference<WebView> mWebViewRef;
public Callback(WebView view, String port) {
mWebViewRef = new WeakReference<>(view);
mPort = port;
}
public void apply(JSONObject jsonObject) throws JSONException {
JSONObject object = new JSONObject();
object.put("responseId", mPort);
object.putOpt("responseData", jsonObject);
final String execJs = String.format(CALLBACK_JS_FORMAT, String.valueOf(object));
//如果activity已经关闭则不回调
if (mWebViewRef != null && mWebViewRef.get() != null && !((BaseWebLoader) mWebViewRef.get().getContext()).getActivity().isFinishing()) {
mHandler.post(new Runnable() {
@Override
public void run() {
mWebViewRef.get().loadUrl(execJs);
}
});
}
}
}
这个类的作用是,定义原生中的回调函数
Webview容器关键代码实现
实现代码如下
注册api方法
//定义api集合
JSBridge.register("namespace_bridge",BridgeImpl.class);
捕获url scheme并执行方法的代码
public boolean shouldOverrideUrlLoading(WebView view, String url){
//读取到url后通过callJava分析调用
JSBridge.callJava(BaseWebLoader.this,view,url);
//如果返回false,则WebView处理链接url,如果返回true,代表WebView根据程序来执行url
return true;
}
里面的关键代码是注册函数,捕获url,执行方法等
API 类实现
实现代码如下
public class BridgeImpl implements IBridge {
/**
* 测试原生方法
*/
public static void testNativeFunc(final BaseWebLoader webLoader, WebView wv, JSONObject param, final Callback callback) {
//可以这样获取参数 param.optString(键值);
//在一个新的线程内执行
new Thread(new Runnable() {
@Override
public void run() {
try {
//执行一些自己的内容
JSONObject object = new JSONObject();
//添加测试信息
object.put("test", "test");
//执行回调
callback.apply(getJSONObject(1, "", object));
} catch (JSONException e) {
e.printStackTrace();
}
}
}).start();
}
}
这个类是一些api的具体实现,webview里面就是注册了这些对应的api
iOS实现部分
说明
这是iOS原生中配套的JSBridge实现代码。iOS中代码是基于UIWebview的,来源于一个github上的开源项目,地址 marcuswestin/WebViewjava scriptBridge
WebViewjava scriptBridgeBase 实现
实现代码如下
@implementation WebViewjava scriptBridgeBase {
__weak id _webViewDelegate;
long _uniqueId;
}
static bool logging = false;
static int logMaxLength = 500;
+ (void)enableLogging { logging = true; }
+ (void)setLogMaxLength:(int)length { logMaxLength = length;}
-(id)init {
self = [super init];
self.messageHandlers = [NSMutableDictionary dictionary];
self.startupMessageQueue = [NSMutableArray array];
self.responseCallbacks = [NSMutableDictionary dictionary];
_uniqueId = 0;
return(self);
}
- (void)dealloc {
self.startupMessageQueue = nil;
self.responseCallbacks = nil;
self.messageHandlers = nil;
}
- (void)reset {
self.startupMessageQueue = [NSMutableArray array];
self.responseCallbacks = [NSMutableDictionary dictionary];
_uniqueId = 0;
}
- (void)sendData:(id)data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName {
NSMutableDictionary* message = [NSMutableDictionary dictionary];
if (data) {
message[@"data"] = data;
}
if (responseCallback) {
NSString* callbackId = [NSString stringWithFormat:@"objc_cb_%ld", ++_uniqueId];
self.responseCallbacks[callbackId] = [responseCallback