Hybird-JS侧的逻辑参考这里同事简书。
iOS侧Native Bridge基于WKWebView开发,虽然messagehandler 可以直接处理JS发送过来的对象,但考虑到iOS、Android的数据统一性,这里还是在JS侧将要发送的消息转化为JSON.stringify
,Native收到消息后,再解析即可。
先上流程图:

进行简要说明,主要分为两大部分:
NativeBridge:处理JS消息接收与Native执行结果回调。
Plugin:Native plugin,执行相应Native能力。
dhjsbridge.js
是封装在Native SDK侧的,在webView初始化时注入。

收到消息后Bridge按照约定格式将消息进行处理,
- (instancetype)initWithDictionary:(NSDictionary *)dict
{
self = [super init];
if (self && [dict isKindOfClass:[NSDictionary class]]) {
if (dict[@"plugin"]) {
NSArray *plugin = [dict[@"plugin"] componentsSeparatedByString:@"."];
if (plugin.count == 2) {
_module = plugin[0];
_action = plugin[1];
}
}
_version = dict[@"version"];
_params = dict[@"data"];
_callbackId = dict[@"callbackId"];
}
return self;
}
这个方法会将接收到的消息处理成DHJSRequest
类型,然后
DHPluginManager
将request当做参数去查找相应的plugin
[[DHPluginManager sharePluginManager] exec:request callback:^(NSDictionary * _Nonnull result) {
[self evaluateJavaScriptWithResult:result];
}];
会根据module
和action
在找到对应的plugin
,SDK加载的时候会将plugin信息读取到pluginMap
,内部根据映射关系进行查找。
plugin是继承自DHBasePlugin
的类需要实现:
- (void)exec:(DHJSRequest *)request callback:(nullable void (^)(DHJSResponse *response))callback;
Native处理完成之后,如需要回调数据的,callback回去即可,callback回调的数据要封装成DHJSResponse
对象,
// plugin是否成功执行 0否 1是
@property (nonatomic, assign) StatusType status;
// plugin回调是否完成,0否 1是,例如:资源分步下载,下载了一部分设置为0,全下载之后置为1
@property (nonatomic, assign) CompleteType complete;
// plugin任务出错描述信息
@property (nonatomic, strong, nullable) NSString *errorMessage;
// plugin执行结果
@property (nonatomic, strong) NSDictionary *result;
首先是将结果回调到DHPluginManager
中,在这里会对DHJSResponse进行再封装,加上callbackId
,最终回调的数据格式是这样子的:
callback(@{@"callbackId":request.callbackId,
@"status":@(response.status),
@"complete":@(response.complete),
@"errorMessage":response.errorMessage,
@"data":response.result
});
由于语言特性,还需要对结果进行转码,这里不再详述这个过程可以看这里
最后通过执行evaluateJavaScript:
方法将结果传递给JS
dispatch_sync(dispatch_get_main_queue(), ^{
[strongSelf.webView evaluateJavaScript:javascriptCommand completionHandler:nil];
});
网友评论