我爱编程

iOS与JS交互

2018-04-09  本文已影响35人  osbornZ

我们有很多业务场景需要实现信息传输的问题。这里来总结下iOS与JS交互问题,Android方式类似。

交互方式

< 1 > 协议拦截

我们可以让 H5开发人员在点击按钮的这个动作中,发起一个虚拟的请求(拼一个无效的 url,类似协议可以传给 native的信息拼入,iOS7.0之前普遍对接WebViewJavascriptBridge 原理类似;

实现:
@protocol UIWebViewDelegate  
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
解析 NSURL *url = [request URL];  Match协议,进行拦截处理。

甚者不将 native的信息拼入,因为是无效 url,请求失败后H5端将需要传给 native 端的信息包入失败信息里面传给我们(多此一举)

< 2 > 对象注入
定义一个协议基于JSExport,然后定义一个Model 实现该协议;
通过webView的valueForKeyPath获取上下文,其路径为documentView.webView.mainFrame.javaScriptContext。

如果需要H5调用Native后进行值回调,可以直接进行参数返回,而不需进行多余的接口调用处理

H5:

const  formData = window.jsmodel.myMethod(JSON.stringify(data));

Native: WebView 加载完成后,进行模型注入
 self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
JsObjCModel *model  = [[JsObjCModel alloc] init];
self.jsContext[@"jsModel"] = model;  //jsModel 为JS调用使用
model.jsContext = self.jsContext;
model.webView   = self.webView;
model.backblock = ^{
    dispatch_async(dispatch_get_main_queue(), ^{
       // [self.navigationController popViewControllerAnimated:YES];
    });
};
self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
    context.exception = exceptionValue;
    LOG(@"异常信息:%@", exceptionValue);
};

JavaScriptCore

iOS7.0后出来的JavaScriptCore framework:

关于Native和H5的交互有各种形式,随着H5越来越成熟,Hybrid App也越来越多,在提高效率缩短开发周期和产品灵活性上有很大的作用.

上一篇下一篇

猜你喜欢

热点阅读