混合开发之iOS快速集成DSBridge

DSBridge-IOS github:https://github.com/wendux/DSBridge-IOS

使用

  1. Native 实现API 代理类

//JsApiTest.m 
@implementation JsApiTest
//for synchronous invocation  
- (NSString *) testSyn:(NSDictionary *) args
{
    return [(NSString *)[args valueForKey:@"msg"] stringByAppendingString:@"[ syn call]"];
}
//for asynchronous invocation
- (NSString *) testAsyn:(NSDictionary *) args :(void (^)(NSString * _Nullable result))handler
{
    handler([(NSString *)[args valueForKey:@"msg"] stringByAppendingString:@"[ asyn call]"]);
}
@end

 

2.注册api代理类至DWebview

DWebview * webview=[[DWebview alloc] initWithFrame:bounds];
jsApi=[[JsApiTest alloc] init];
webview.JavascriptInterfaceObject=jsApi;

 

3.在Javascript中调用Native API

//Call Native API
var bridge = getJsBridge();
//Call synchronously 
var str=bridge.call("testSyn", {msg: "testSyn"});
//Call asynchronously
bridge.call("testAsyn", {msg: "testAsyn"}, function (v) {
 alert(v);
})

//Test will be called by oc, must be global function!
function test(arg1,arg2){
 return arg1+arg2;
}

 

4.最后,Native中调用Javascript API

[_webview callHandler:@"test"
  arguments:[[NSArray alloc] initWithObjects:@1,@"hello", nil]
  completionHandler:^(NSString *  value){
      NSLog(@"%@",value);
  }];

 

Javascript API 介绍

getJsBridge

获取javascript bridge 对象;此方法为sdk内置,可在任何地方调用。

bridge.call(method,[args,callback])

功能:调用Native api

method: api函数名

args:参数,类型:json, 可选参数

callback(String returnValue): 处理调用结果的回调,仅异步调用时需要.

注意

Native API 方法签名

为了在ios和android平台下兼容,对IOS端Native API接口约定如下:

  1. 所有API返回值类型为NSString, 不存在时返回nil即可。
  2. 参数以JSON传递; DSBridge会将js参数自动转化为NSDictionary 

注:JsApiTest.m中实现的方法可以不在JsApiTest.h中声明

调用Javascript

DWebView提供了两个api用于调用js

//调用js api(函数)
-(void)callHandler:(NSString *)methodName arguments:(NSArray * _Nullable)args 
                   completionHandler:(void (^)(NSString * _Nullable))completionHandler;
//执行任意js代码
- (void)evaluateJavaScript:(NSString *)javaScriptString 
                  completionHandler:(void (^ _Nullable)(NSString * _Nullable))completionHandler;

 

callHandler中,methodName 为js函数名,args为参数数组,可以接受数字、字符串等。

两个函数中completionHandler为完成回调,用于获取js执行的结果。

调用时机

DWebview只有在javascript context初始化成功后才能正确执行js代码,而javascript context初始化完成的时机一般都比整个页面加载完毕要早,随然DSBridge能捕获到javascript context初始化完成的时机,但是一些js api可能声明在页面尾部,甚至单独的js文件中,如果在javascript context刚初始化完成就调用js api, 此时js api 可能还没有加载,所以会失败,为此专门提供了一个api设置一个回调,它会在页面加载结束后调用,为了和didpagefinished区分,我们取名如下:

- (void)setJavascriptContextInitedListener:(void(^_Nullable)(void))callback;

若是端上主动调用js,请在此回调中进行 。示例如下:

__block DWebview * _webview=webview;
[webview setJavascriptContextInitedListener:^(){
  [_webview callHandler:@"test"
  arguments:[[NSArray alloc] initWithObjects:@1,@"hello", nil]
  completionHandler:^(NSString *  value){
      NSLog(@"%@",value);
  }];
}];

完整的示例请查看demo工程。

关于DWebview

SDK中有三个webview:

DWKwebview:继承自WKWebView,内部已经实现js prompt、alert、confirm函数对应的对话框。

DUIwebview:继承自UIWebView

DWebview:自定义view, 内部在ios8.0以下会使用DUIwebview, 大于等于8.0会使用DWKwebview。

所有的webview除了都实现了上述api之外,提供了一个加载网页的便捷函数:

- (void)loadUrl: (NSString *) url;

您可以根据具体业务使用任意一个,不过一般情况下优先选用DWebview,它在新设备上更省资源,效率更高。

DWebview还提供了一些其它api和属性,具体请查看其头文件,需要特殊说明的是,有一个api:

- (id _Nullable) getXWebview;

它可以返回DWebview内部使用的真实webview, 值会是DUIwebview和DWKwebview的实例之一,您可以通过isKindOfClass来判断,吃函数主要用于扩展DWebview,下面可以看一下loadRequest的大概实现:

- (void)loadRequest:(NSURLRequest *)request
{
      id webview=[self getXWebview];
    if([webview isKindOfClass:[DUIwebview class]]){
        [(DUIwebview *)webview loadRequest:request];
    }else{
        [(DWKwebview *)webview loadRequest:request];
    }
}

Alert dialog

DWebview已经实现 alert、prompt、comfirm对话框,您可以不做处理,也可以自定义。值得一提的是js 在调用alert函数正常情况下只要用户没有关闭alert对话框,js代码是会阻塞的,但是考虑到alert 对话框只有一个确定按钮,也就是说无论用户关闭还是确定都不会影响js代码流程,所以DWebview中在弹出alert对话框时会先给js返回,这样一来js就可以继续执行,而提示框等用户关闭时在关闭即可。如果你就是想要阻塞的alert,可以自定义。而DWebview的prompt、comfirm实现完全符合ecma标准,都是阻塞的。

请不要手动设置DUIwebview的delegate属性,因为DUIwebview在内部已经设置了该属性,如果您需要自己处理页面加载过程,请设置WebEventDelegate属性。

 

转载于:https://www.cnblogs.com/dianming/p/6902937.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值