美文网首页
Hybird-Native bridge

Hybird-Native bridge

作者: whqfor | 来源:发表于2019-01-29 20:09 被阅读0次

Hybird-JS侧的逻辑参考这里同事简书

iOS侧Native Bridge基于WKWebView开发,虽然messagehandler 可以直接处理JS发送过来的对象,但考虑到iOS、Android的数据统一性,这里还是在JS侧将要发送的消息转化为JSON.stringify,Native收到消息后,再解析即可。

先上流程图:

Hybird Native.png

进行简要说明,主要分为两大部分:

NativeBridge:处理JS消息接收与Native执行结果回调。
Plugin:Native plugin,执行相应Native能力。

dhjsbridge.js是封装在Native SDK侧的,在webView初始化时注入。

JS给Native发消息之后,在Native 侧收到的消息格式如下: msg数据格式.png

收到消息后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];
}];

会根据moduleaction在找到对应的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];
});

相关文章

网友评论

      本文标题:Hybird-Native bridge

      本文链接:https://www.haomeiwen.com/subject/zlzxsqtx.html