WKWebview 和 WebViewJavascriptBridge

https://www.cnblogs.com/L-vincen/p/6681435.html

链接在这里,有很多不错的文章,大家可以去看一下

WKWebview

Demo在这

先来个最直观的,为什么要用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调用


//注册原生方法给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 }];
}

  • 看下原生代码

初始化

#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的开发者选项,如果没有,去偏好设置->高级->显示开发者选项就有了


如果调用不成功,可能是这些原因

function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { 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)
}

写在JS里的代码这里是不能动的,原样贴上去就行。  之前有一次莫名其妙老是调用不了OC的方法, 后来发现是

window.WebViewJavascriptBridg 写成了 window.WebView JavascriptBridg, 一直没看到,在网页端一直报找不到 WebViewJavascriptBridg这个变量,看到报错应该能发现在定义的时候有出错

还有一个有意思的就是我设置了   _baseWebview.navigationDelegate=self;之后竟然也调用不了,JS端不走click()方法

貌似只能用    [_webViewBridge setWebViewDelegate:self];

这个方法,具体原因再看看。

WKWebview 和 WebViewJavascriptBridge的更多相关文章

  1. iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge

    上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现JS 与OC 的互相调用,这一篇来介绍一下WKWebView 又是如何通过WebViewJavascr ...

  2. IOS进阶之WKWebView

    前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...

  3. WebViewJavascriptBridge的基本原理

    前言 WebViewJavascriptBridge是支持到iOS6之前的版本的,用于支持native的iOS与javascript交互.如果需要支持到iOS6之前的app,使用它是很不错的.本篇讲讲 ...

  4. WebViewJavascriptBridge

    上一篇文章介绍了通过UIWebView实现了OC与JS交互的可能性及实现的原理,并且简单的实现了一个小的示例DEMO,当然也有一部分遗留问题,使用原生实现过程比较繁琐,代码难以维护.这篇文章主要介绍下 ...

  5. WebViewJavascriptBridge详细使用

    前言 WebViewJavascriptBridge是支持到iOS6之前的版本的,用于支持native的iOS与javascript交互.如果需要支持到iOS6之前的app,使用它是很不错的.本篇讲讲 ...

  6. iOS WebViewJavascriptBridge初步尝试与图文详细讲解

    JS和OC的交互这是个永恒话题,使用场景也是越来越多,如今一些reactnative.vue框架等,都是在重点结合原生与H5的混合使用. 那么,如何快捷方便的使用两者交互是一个很重要的关键点. 1.传 ...

  7. iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge

    WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...

  8. iOS开发之WKWebView代替UIWebView

    前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...

  9. WebViewJavascriptBridge的使用说明

    WebViewJavascriptBridge 项目介绍 在Obj-C 和 WKWebView, UIWebView 中的 Javascript之间传送信息的桥梁. 项目地址 如何使用 Javascr ...

随机推荐

  1. C语言结构体指针成员强制类型转换

    #include <stdio.h> #include <stdlib.h> typedef struct ListElmt_ { void *data; struct Lis ...

  2. 中缀表达式转后缀表达式(Python实现)

    中缀表达式转后缀表达式 中缀表达式转后缀表达式的规则: 1.遇到操作数,直接输出: 2.栈为空时,遇到运算符,入栈: 3.遇到左括号,将其入栈: 4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到 ...

  3. P1582倒水 位运算

    题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒 ...

  4. P1198 [JSOI2008]最大数【树状数组】

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: L 不超过当前数列的长度. (L &g ...

  5. K-均值聚类——电影类型

    K-均值聚类 K-均值算法试图将一系列样本分割成K个不同的类簇(其中K是模型的输入参数),其形式化的目标函数称为类簇内的方差和(within cluster sum of squared errors ...

  6. 3,Python常用库之三:Matplotlib

    一.Matplotlib基础知识 Matplotlib中的基本图表包括的元素 x轴和y轴 axis水平和垂直的轴线 x轴和y轴刻度 tick刻度标示坐标轴的分隔,包括最小刻度和最大刻度 x轴和y轴刻度 ...

  7. 算法:枚举法---kotlin

    枚举法:效率低,循环所有的情况,找到正确答案 用于解决数学问题,还是很简单的. 比如,奥数里面: 算 法 描 述 题X题=题题题题题题 其中 算法描述题每一个为一个数字,请写出正确的数字. ok,我们 ...

  8. Result Maps collection does not contain value for XXXXX

    在做mybatis多表查询的时候,出现了下面的错误: java.lang.IllegalArgumentException: Result Maps collection does not conta ...

  9. android 管理Touch事件

    The onInterceptTouchEvent() method gives a parent the chance to see any touch event before its child ...

  10. 《Cracking the Coding Interview》——第18章:难题——题目5

    2014-04-29 01:51 题目:你有一个文本文件,每行一个单词.给定两个单词,请找出这两个单词在文件中出现的其中一对位置,使得这两个位置的距离最短. 解法:我的思路是建立倒排索引,计算出所有单 ...