[iOS] 使用WebViewJavascriptBridge实

作者: 陈向阳哈 | 来源:发表于2015-09-29 15:36 被阅读27477次

    前言###

    当下,很多APP里面都会有HTML5网页,我们除了简单的用WebView加载显示外,很多情况下,我们还需要和WebView进行交互,比如点击WebView上面的按钮调用OC端的函数实现具体操作。

    因此今天为大家介绍一个优秀的开源小项目,就是我们今天的主角--WebViewJavascriptBridge。它主要帮助我们优雅的实现OC与JS的交互,非常方便简洁。

    当然,有很多优秀的开发者写过WebViewJavascriptBridge的使用包括实现原理,首先表示感激和敬意。但是作为一个初学者或者一个急于实现功能的人来说,大部分时候我们更希望一个直奔主题的文章。所以,本文的核心就是WebViewJavascriptBridge在实际开发中的使用。

    使用步骤####

    • Github上下载WebJavaScriptBridge
    • 解压缩包,将WebViewJavascriptBridge文件夹拖到你的工程中
    1.png
    • 在需要使用WebViewJavascriptBridge的类文件中引入头文件WebViewJavascriptBridge.h
    • 加载UIWebView,遵守<UIWebViewDelegate>协议

    具体使用####

    • 创建并初始化WebJavaScriptBridge实例

         #import "ExampleUIWebViewController.h"
       #import "WebViewJavascriptBridge.h"
      
       @interface ExampleUIWebViewController ()
           //声明`WebViewJavascriptBridge`对象为属性
         @property WebViewJavascriptBridge* bridge;
      
        @end
      
            - (void)viewWillAppear:(BOOL)animated {
      
             //用UIWebView加载web
              UIWebView* webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
        
           //设置能够进行桥接 
              [WebViewJavascriptBridge enableLogging];
           // 初始化*WebViewJavascriptBridge*实例,设置代理,进行桥接
             _bridge = [WebViewJavascriptBridge bridgeForWebView:webView webViewDelegate:self handler:^(id         data, WVJBResponseCallback responseCallback) {
       NSLog(@"ObjC received message from JS: %@", data);
               responseCallback(@"Response for message from ObjC");
               }];
      
      }
      
    • JS调用OC

      • 什么是JS调用OC?

        举个例子来说就是在网页中有一个登录按钮,点击登录按钮后,具体的登录功能是由OC端实现的,即登录功能实现需要我们在工程里有一个类似loginMethod的函数去具体操作。

      • 工作流程

        站在实际开发的角度来解释,就是假如现在有一个网页,在网页中有个登录按钮需要通过JS调OC的方式实现。那么我们首先需要跟负责网页编码的人员(一般是后台)商定出一个方法名称,也就是给这个登录按钮点击事件取个名字,例如叫loginCallBack。然后我们需要在代码里注册这个事件并负责它的具体实现。当用户点击这个登录按钮的时候,后台就会通知给这个事件的注册者去执行,有点像block的执行顺序。

      • 代码实现

        假如我们现在商定了一个事件名称为loginFunc,我们来看一下代码实现。

            /***
            /@param registerHandler 要注册的事件名称(这里我们为loginFunc)
            /@param handel 回调block函数 当后台触发这个事件的时候会执行block里面的代码
            ***/
            [_bridge registerHandler:@"loginFunc" handler:^(id data, WVJBResponseCallback responseCallback) {
             // data 后台传过来的参数,例如用户名、密码等
        
           NSLog(@"testObjcCallback called: %@", data);
           
             //具体的登录事件的实现,这里的login代表实现登录功能的一个OC函数。
                        [self login];   
           
             // responseCallback 给后台的回复 
        
                responseCallback(@"Response from testObjcCallback");
              }];
        
    • OC调用JS

      • 什么是OC调用JS

        如果你理解了JS调用OC,那么OC调用JS就应该差不多懂了。同样举个例子,我们的原生APP上有个输入框,我们输入完成后,让它显示在网页上面的用户名处。这样,我们就是OC要实现的一个事件让网页去真正实现了,也就是OC调用JS。

      • OC调用JS

      和JS调用OC的流程大致一样,还是需要和网页编写人员商定出一个事件名,然后在网页里面先把注册这样一个事件并把实现体写好,等到我们OC去触发这个事件(比如点击按钮)就会去网页里面找到这个事件的实现体并执行。

      • 代码实现

        假如我们现在商定了一个注册事件,事件名称为registerFunc,我
        们来代码实现一下

             //不需要传参数,不需要后台返回执行结果
              [_bridge callHandler:@"registerFunc"];
        
            //需要传参数,不需要从后台返回执行结果
              /***
               @param callHandler 商定的事件名称,用来调用网页里面相应的事件实现
               @param data id类型,相当于我们函数中的参数,向网页传递函数执行需要的参数
             ***/
        
             [_bridge callHandler:@"registerFunc" data:@"name"];
        
            //需要传参数,需要从后台返回执行结果
        
             [_bridge callHandler:@"registerFunc" data:@"name" responseCallback:^(id responseData) {
        
                NSLog(@"后台执行完成后返回的数据");
                  
              }];
        
    • 发送消息

      • 概述

        我们可以单纯地向JS发送数据,比如我们可以在网页加载完成后向网页发送一条加载完成的消息,或者传一个标题。

      • 代码实现

        //不需要后台返回执行结果或数据
            [_bridge send:@"红色"];
        
        //需要后台返回执行结果或数据
                [_bridge send:@"红色" responseCallback:^(id responseData) {
        
                NSLog(@"后台执行完成后返回的数据 %@", responseData);
           
               }];
        

    注意点

    一定要注意和网页端商定的方法名必须要保证OC代码 里和网页编码里统一。在调用之前,必须要先注册事件,写好实现体。

    总结####

    本文只是简单地介绍了WebViewJavascriptBridge在实际开发中常用的几个方法,还有一些方法没有意义详讲,希望大家在掌握了这几个方法的使用后也去研究一下里面的其他方法。另外,本文重点是让ios工程师能快速使用,一些原理的东西还有JS方面的编码都省略了,可能文中有些地方理解不当或者不够深入,后期会再完善修改.最后,希望大家多提宝贵意见。

    大家可去gitHub下载demo查看源码。

    相关文章

      网友评论

      • UncleFool:你好,请教一个问题。js端在调用window.webkit.messageHandlers.AppModel.postMessage()时,需要iOS端向js端传递一个值。请问上面这个方法可以接收返回值吗,iOS端应该怎么处理呢?
        陈向阳哈:https://www.jianshu.com/p/433e59c5a9eb 看这个吧
      • 我叫王可可:这个框架能解决Swift与JS交互吗?
        陈向阳哈:@我叫王可可 用swiftWebviewBridge
      • 新地球说着一口陌生腔调:pod 安装失败

        platform :ios, ‘7.0’
        target ‘ExampleApp-iOS’ do
        pod 'WebViewJavascriptBridge', '~> 5.0'
        end
        这样配置有问题吗
      • bd79beeeac7f:可以加我QQ吗?有问题要请教358863619,感激不尽
      • 峰子1994:你好我下载了demo了没有看懂demo讲的什么东西呀
      • PGOne爱吃饺子:大神,请问后台说为什么获取不到_bridge这个对象呢
      • PGOne爱吃饺子:大神,交互不成功是什么原因啊,也是按照你上面的代码写的啊
      • BartonQiu:发送消息中的send:、 send:responseCallback:^,第三方并未提供API接口,需要我们去改动吗?
      • 呆呆滴木木菇凉:您好,想请假一下交互的问题?3183001079,谢谢
      • a632073b5a6a: 大大,请教一个问题,按照网上demo写了后,网页在APP内加载交互是正常的,但是网页在APP之外(例如,分享QQ,微信,safari)加载后交互就不正常了,这是什么问题呢?
        a632073b5a6a:@lyq226809 如果可以麻烦加下我QQ,809996066
      • ugvibib:写的挺好,实用
      • aa676c2b66ca:....加毛线qq...人家能分享经验就很可以了.....剩下的应该自己查资料 仿照demo写代码..网上资料够多.....你们这么懒...怎么做程序员...
      • 30b6c8bcd5d4:新手可以加我QQ下吗,很多问题想请教您 QQ:274413070
      • 雪_晟:很简单 明了
      • 5ca30df72f7b:你好。关于内存问题,有想要请假的。希望能加我好友QQ389195034
      • WintersMoon:赞一个,简单明了,尤其概念解释的很通俗
      • b9286538860c:目前为止WebViewJavaScriptBridge,要么单是iOS的jsBridge ,要么是 android 的jsBridge,他们的调用方式都不一样,在js那边。
        不知道你们那边怎么做到同时兼容iOS和Android 的 jsBridge,求解。
        陈向阳哈:@unigh 两套:sweat_smile: 安卓的不用写什么
      • 饭饭vip:大神加我QQ 好么 475681442,我最近再看这个,有点方~
      • a54e2deb54ad:你好,可以加我扣扣吗?1940184774,我最近看这些,好多不是很清楚
      • 93da835fc2d6:381169288,菜鸟一枚,求大神指导
      • 苏坡乔:很好 :clap:
      • 77ff69143498:有没有demo啊 让我研究下
        77ff69143498:@陈向阳哈 我是小白 我看了他的那个demo 看不懂 而且注释全英文 都懵逼了
        陈向阳哈:@Yin_Jone 网上搜这个第三方 它带得有
      • 8cb5c1009f57:大神,可以加一下qq吗920067272,我想研究一下 oc js 交互
      • 4fc8c7b46c02:谢谢分享 但是我很想知道后台相关的代码大概是什么样的 有什么推荐 或者有截图么 谢谢 :smile:
      • c4857242be80:可以加我QQ吗?有问题要请教1434902006,感激不尽
      • 557b157e2df8:可以加个qq么,我刚刚接触这个,不知道怎么写,1024699657
      • 62f60ca57ef9:那个js端的代码怎么写啊,我js想调用ios的方法,找了半天额,希望你可以加下我QQ:853686688指导我下,谢谢了额 :sob:
        陈向阳哈:@啊啊啊啊啊啊小军 明天吧,我今天有事,明天我加你
        62f60ca57ef9:@陈向阳哈 英文比较差额,我照着例子写,不调用额,可以加下QQ吗》截图你帮我看下怎么改,我还是菜鸟= =
        陈向阳哈:@啊啊啊啊啊啊小军 Js端的代码你可以下载一个WebviewJavaScriptBridge的demo.里面有一个本地网页的模版
      • 2cadf0a1a3f5:后台那边写的js文件需要导入我的工程吗?我做的是要把网页版的做成iOS端的APP,用的webview加载网页,但我要捕获网页上的扫一扫按钮,实现扫描二维码功能
        2cadf0a1a3f5:@陈向阳哈 你好,我要实现两个按钮的点击事件,有一个成功了,另外一个失败了,找不到原因在哪,可不可以加我下qq:306110597
        2cadf0a1a3f5:@陈向阳哈 好的,谢谢
        陈向阳哈:不用倒入你的工程 你这个需求,需要你在客户端定义一个事件,点扫一扫按钮的时候,后台根据你定义的事件去调用你前段的方法 你这个看看JS调用OC那部分 后台网页事件的调用你可以下载一个WebViewJavaScriptBridge的DEMO看看,里面有一个写好的网页模版
      • 2cadf0a1a3f5: //设置能够进行桥接
        [WebViewJavascriptBridge enableLogging];
        __weak typeof(self)safeSelf=self;
        //桥接
        _wBridge=[WebViewJavascriptBridge bridgeForWebView:_webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"js:%@",data);

        responseCallback(@"response for message from objc");
        }];

        //scancode
        [_wBridge registerHandler:@"scanning" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"data---------%@",data);
        [safeSelf scannerClick];
        responseCallback(@"OK");
        }];


        [safeSelf scannerClick],方法没有调用,可能是什么原因??
        尧阿尧尧到外婆桥:我看demo没看懂,如果是加载一个网页怎么加载,然后交互的方法顺序是什么,能指导下吗,谢谢,这是我的QQ616086449
        陈向阳哈:@唯的执著 回调没有走,就是交互失败了,可能后台那边写的不对,看看方法名是不是一样
      • xiechao:你好,能加我QQ么,528237535,我有点关与交互的问题想像你请教一下,谢了!
        陈向阳哈:嗯 是的 他那边要写调用或者实现
        李凡大超人:js端需要把那段固定的代码集成进去是吧,然后就可以根据注册方法的方式交互了是么?单是oc端做了处理是不可以的是么?
        陈向阳哈:@xiechao 嗯
      • efc2fa431e02:真的是不错,正好要用到

      本文标题:[iOS] 使用WebViewJavascriptBridge实

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