iOS 使用DSBridge

DSBridge是一个用来用来原生和h5交互的轻量级框架,下面我说一下在iOS端DSBridge的使用

安装

使用cocoapods来进行安装

pod "dsBridge"

使用

  1. 新建一个用于和JavaScript交互的类
#import "JsApiTest.h"
#import "dsbridge.h"
 
@implementation JsApiTest
 //  同步
- (NSString *)testSyn: (NSString *) msg
{
    NSLog(@"我被同步调用了");
    return [msg stringByAppendingString:@"[ syn call]"];
}
 // 异步
- (void)testAsyn:(NSString *) msg :(JSCallback) completionHandler
{
    NSLog(@"我被异步调用了");
    completionHandler([msg stringByAppendingString:@" [ asyn call]"],YES);
}
@end

  1. 初始化DWKWebView,并将此View添加到控制器的View上,同时向DWKWebView中注册自JsApiTest

    self.dwebview = [[DWKWebView alloc] initWithFrame:self.view.bounds];
    [self.dwebview addJavascriptObject:[[JsApiTest alloc] init] namespace:nil];
    [self.view addSubview:self.dwebview];
    
  2. 在js代码中引入dsbridge.js,可以采用cdn方式引入,也可通过npm方式引入,我这边采用的是cdn的方式引入

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            .box1 {
                width: 100px;
                height: 100px;
                background-color: yellow
            }
        </style>
        <script src="https://cdn.jsdelivr.net/npm/dsbridge@3.1.4/dist/dsbridge.js"> </script>
        <script>
            window.onload = function () {
                var button1 = document.getElementById("test1");
                var button2 = document.getElementById("test2");
                button1.onclick = function () {
                    //同步调用
                    var str = bridge.call("testSyn", "testSyn");
                }
                button2.onclick = function () {
                    //异步调用
                    bridge.call("testAsyn", "testAsyn", function (v) {
                        alert(v);
                    })
                }
                //注册 javascript API 
                bridge.register('addValue', function (l, r) {
                    return l + r;
                })
            }
        </script>
    </head>
    
    <body>
        <button id="test1">同步调用原生方法</button>
        <button id="test2">异步调用原生方法</button>
    
    </body>
    
    </html>
    

    同时我在js中注册了addValue方法来供原生的调用,在iOS代码中可以通过callHandler来调用js中的注册的方法

    [self.dwebview callHandler:@"addValue" arguments:@[@3,@4] completionHandler:^(NSNumber* value){
         NSLog(@"%@",value);
    }];
    

支持进度的回调

通常情况下,调用一个方法结束后会返回一个结果,是一一对应的。但是有时会遇到一次调用需要多次返回的场景,比如在javascript钟调用端上的一个下载文件功能,端上在下载过程中会多次通知javascript进度, 然后javascript将进度信息展示在h5页面上,这是一个典型的一次调用,多次返回的场景,如果使用其它Javascript bridge, 你将会发现要实现这个功能会比较麻烦,而DSBridge本省支持进度回调,你可以非常简单方便的实现一次调用需要多次返回的场景,下面我们实现一个倒计时的例子:

oc中的代码:

- (void)callProgress:(NSDictionary *)args callback:(JSCallback)completionHandler
{
    self.value=10;
    self.hanlder=completionHandler;
    self.timer =  [NSTimer scheduledTimerWithTimeInterval:1.0
                                              target:self
                                            selector:@selector(onTimer)
                                            userInfo:nil
                                             repeats:YES];
}
-(void)onTimer{
    NSLog(@"开始调用");
    if(self.value!=-1){
        self.hanlder([NSNumber numberWithInt:self.value--],NO);
    }else{
        self.hanlder(@"",YES);
        [self.timer invalidate];
    }
}

JavaScript中的代码的实现:

button3.onclick = function () {
      bridge.call("callProgress", function (value) {
            ocument.getElementById("progress").innerText = value
        })
}

OC中的方法签名

注意: DSBridge对OC中的方法有严格的要求必须符合以下格式

  1. 同步api
(id) handler:(id) msg

参数可以是任何类型, 但是返回值类型不能为 void。 如果不需要参数,也必须声明,声明后不使用就行

  1. (void) handler:(id)arg :(void (^)( id result,BOOL complete))completionHandler)
    

js中通过命名空间来调用OC中的方法

示例如下:

            // 通过命名空间来调用
            button4.onclick = function () {
                var ret = dsBridge.call("echo.syn", {
                    msg: " I am echoSyn call",
                    tag: 1
                })
                alert(JSON.stringify(ret))
                // call echo.asyn
                dsBridge.call("echo.asyn", {
                    msg: " I am echoAsyn call",
                    tag: 2
                }, function (ret) {
                    alert(JSON.stringify(ret));
                })
            }

js中可以注册一个对象,指定一个命名空间供OC来进行调用

dsBridge.register("test",{
  tag:"test",
  test1:function(){
    return this.tag+"1"
  },
  test2:function(){
    return this.tag+"2"
  }
})
  
//namespace test1 for asynchronous calls  
dsBridge.registerAsyn("test1",{
  tag:"test1",
  test1:function(responseCallback){
    return responseCallback(this.tag+"1")
  },
  test2:function(responseCallback){
    return responseCallback(this.tag+"2")
  }
})

以上就是使用DSBridge用来JavaScript和原生iOS之间的交互

代码在这

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容