WKWebview 和 WebViewJavascriptBridge

WKWebview

先来个最直观的,为什么要用WKWebview!!

这里分别用WKWebview 和UIWebview加载了一个百度的网页,内存的占用情况如下

  • WKWebview

  • UIWebview

相比之下,WKWebView占用20M,而UIWebView占用73M,这性能提升的不只一点点。
具体的要了解和使用 WKWebview 的,给个友情链接  刘彦玮的技术博客
这里主要讲下 WKWebViewJavascriptBridge

WebViewJavascriptBridge

Github地址在这里
https://github.com/marcuswestin/WebViewJavascriptBridge)



之前我也是自己封装WK做的交互,后面偶然间看到的这个开源库,8000+ star,那能差到哪去,果断上手。 安卓那边也有个类似这种的库, 2000+ star,调用方法基本类似, 这样 与前端的交互就可以只写一套代码了,轻松加愉快。

  • 先做一个简单Demo熟悉下
    先导入
    pod ‘WebViewJavascriptBridge‘, ‘~> 5.0

看一下目录

如果用UIwebview就导入WebViewJavascriptBridge。

WKWebViewJavascriptBridge 是后面加入的,用WKWebview要导入这个头文件

这里用一个单例类用来管理交互 函数,像Cordova那种写插件的形式,写在一个类供JS调用,具体的可以看Demo。


  • JS 调用 原生 方法

贴一下 demo.html 的 JS 段落 ,看注释,主要知道JS 怎么调用 原生方法 和 注册JS方法 供JS调用

 <script type="text/javascript">

//这是必须要写的,用来初始化一些设置
        function setupWebViewJavascriptBridge(callback) {
            if (window.WebViewJava scriptBridge) { return callback(WebViewJavascriptBridge); }
            if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
            window.WVJBCallbacks = [callback];
            var WVJBIframe = document.createElement(‘iframe‘);
            WVJBIframe.style.display = ‘none‘;
            WVJBIframe.src = ‘wvjbscheme://__BRIDGE_LOADED__‘;
            document.documentElement.appendChild(WVJBIframe);
            setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
        }

//这里是 OC 掉JS , 需要给OC调用的函数必须写在这个函数里面
        setupWebViewJavascriptBridge(function(bridge) {

            bridge.registerHandler(‘testJSFunction‘, function(data, responseCallback) {
                alert(‘JS方法被调用:‘+data);
                responseCallback(‘js执行过了‘);
            })

        })

//这个 shareClick 就是 原生那边 注入的函数 , 通过这个方法来调用原生 和传值
//parmas 是JS 给OC的数据 , response 是 OC函数被调用之后 再 告诉JS 我被调用了
//比如微信分享,给Dic给原生 , 原生分享成功后再把结果回调给JS 进行处理
        function shareClick() {
            var params = {‘title‘:‘测试分享的标题‘,‘content‘:‘测试分享的内容‘,‘url‘:‘http://www.baidu.com‘};
            WebViewJavascriptBridge.callHandler(‘shareClick‘,params,function(response) {

                console.log(response);

            });
        }

    </script>

  • 看下原生代码

初始化

#import "WKWebViewJavascriptBridge.h"  //注意是 WK 开头的 , 如果不需要适配8.0以下的可以直接就用WKWebview
@property WebViewJavascriptBridge* bridge;
self.bridge = [WebViewJavascriptBridge bridgeForWebView:webView];  
//注册原生方法给JS调用- (void)registShareFunction
{
    [_webViewBridge registerHandler:@"shareClick" handler:^(id data, WVJBResponseCallback responseCallback) {
        // data 的类型与 JS中传的参数有关
        NSDictionary *tempDic = data;
        // 在这里执行分享的操作
        NSString *title = [tempDic objectForKey:@"title"];
        NSString *content = [tempDic objectForKey:@"content"];
        NSString *url = [tempDic objectForKey:@"url"];

        // 将分享的结果返回到JS中
        NSString *result = [NSString stringWithFormat:@"分享成功:%@,%@,%@",title,content,url];

        responseCallback(result);  //回调给JS

    }];
}

//原生调用JS , JS 中先声明testJSFunction 函数
-(void)pp_hander
{

    //testJSFunction 是JS的方法
    [_webViewBridge callHandler:@"testJSFunction" data:@"一个字符串" responseCallback:^(id responseData) {

        NSLog(@"调用完JS后的回调:%@",responseData);

    }];
}

基本用法差不多就这些,很简洁,用起来也挺简单,准备接入目前的项目使用。



如果不知道在模拟器怎么看调试网页,可以看看淘宝前端团队的这篇 
在 iOS 模拟器中调试 Web 页面

Safari的开发者选项,如果没有,去偏好设置->高级->显示开发者选项就有了

时间: 2024-10-11 23:19:40

WKWebview 和 WebViewJavascriptBridge的相关文章

WKWebView与js交互之完美解决方案

??最近对团队中的混合开发框架进行了重构,下面就和大家来说说自己的思路以及解决方案. ??随着H5功能愈发的强大,没进行过混合开发的小伙们都不好意思说自己能够独立进行iOS的app开发,在iOS7操作系统下,常用的native,js交互框架有easy-js,WebViewJavascriptBridge,以及结合javaScriptCore的框架.easy-js 很早的一个框架了,已经好几年没有人维护了,里面有很多隐藏很深的坑,新人如果没有用过的话,建议不要再用了.主要是js新建一个隐藏的ifr

IOS 进阶之 WKWebView

前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到IOS8,第一个要改的自然是用WKWebView替换原来的UIWebView.WKWebView有很多明显优势: 更多的支持HTML5的特性 官方宣称的高达60fps的滚动刷新率以及内置手势 将UIWebViewDelegate与UIWebView拆分成了14类与3个协议,以前很多不方便实现的功能得

IOS进阶之WKWebView

前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到IOS8,第一个要改的自然是用WKWebView替换原来的UIWebView.WKWebView有很多明显优势: 更多的支持HTML5的特性 官方宣称的高达60fps的滚动刷新率以及内置手势 将UIWebViewDelegate与UIWebView拆分成了14类与3个协议,以前很多不方便实现的功能得

OC与JS交互之WebViewJavascriptBridge

上一篇文章介绍了通过UIWebView实现了OC与JS交互的可能性及实现的原理,并且简单的实现了一个小的示例DEMO,当然也有一部分遗留问题,使用原生实现过程比较繁琐,代码难以维护.这篇文章主要介绍下开源库WebViewJavascriptBridge的实现原理和使用方法,并用此开源库重写之前的示例,同样,本文的示例代码我会在文章后面给出欢迎star 我们在上一篇文章结尾处简要介绍了WebViewJavascriptBridge的实现原理也是基于UIWebView的协议拦截,通过阅读源码发现,中

iOS中html5的交互:WebViewJavascriptBridge

https://github.com/marcuswestin/WebViewJavascriptBridge Setup & Examples (iOS & OSX) Start with the Example Apps/ folder. Open either the iOS or OSX project and hit run to see it in action. To use a WebViewJavascriptBridge in your own project: 1)

WebViewJavascriptBridge源码分析

最近抽时间看了一遍WebViewJavascriptBridge这个开源框架,把看到的内容记录下来 源码地址:https://github.com/marcuswestin/WebViewJavascriptBridge 1.对外接口 初始化OC 初始化JS [WebViewJavascriptBridge bridgeForWebView:(UIWebView/WebView*)webview handler:(WVJBHandler)handler]   [WebViewJavascript

WebViewJavascriptBridge浅析

WebViewJavascriptBridge是一个Objective-C与JavaScript进行消息互通的三方库.通过WebViewJavascriptBridge,我们可以很方便的实现OC和Javascript互调的功能.WebViewJavascriptBridge实现互调的过程也容易理解,就是在OC环境和Javascript环境各自保存一个相互调用的bridge对象,每一个调用之间都有id和callbackid来找到两个环境对应的处理.从Github上下载源码之后,可以看到核心类主要包

WebViewJavascriptBridge详细使用

前言 https://www.jianshu.com/p/e37ccf32cb5b WebViewJavascriptBridge是支持到iOS6之前的版本的,用于支持native的iOS与javascript交互.如果需要支持到iOS6之前的app,使用它是很不错的.本篇讲讲WebViewJavascriptBridge的基本原理及详细讲讲如何去使用,包括iOS端的使用和JS端的使用. 经过多番百度.Google,发现WebViewJavascriptBridge的资源讲解不是翻译官方文档就是

iOS 与 js交互的其一方法 WebViewJavascriptBridge的使用

#import <WebViewJavascriptBridge.h> /// @interface ZWBridgeViewController ()<WKNavigationDelegate, WKUIDelegate, UIGestureRecognizerDelegate> @property (nonatomic, strong) ZWCommonNavBar *navBar; @property (nonatomic, strong) WKWebView *webVie