背景

iOS8后推出WKWebView,到现在已经iOS13,UIWebView即将不支持。

对比

UIWebView:

加载速度慢、内存占用多

WKWebView(苹果官方文档):

在性能、稳定性、功能方面有很大提升(高达60fps的滚动刷新率以及内置手势);

支持了更多的HTML5特性、JavaScript库;

将UIWebViewDelegate与UIWebView重构成了14个类与3个协议;

JS交互

关于JS交互这篇很详细

UIWebView:

Native->JS

通过调用执行JS代码的API实现:

NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];

复制代码JS-> Native

1、在shouldStartLoadWithRequest:代理方法中拦截信息,与前端协商好URL映射到原生方法。该回调在前端href或者iframe变化时触发。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

NSString *url = request.URL.absoluteString;

if (url 字符串规则匹配) {

// 映射方法,执行Native逻辑

return NO;

}

return YES;

}

复制代码

2、通过JavaScriptCore注入

@protocol JSCallNativeFunc

-(void)dosomething

@end

self Class

//KVC得到WebView的JS上下文

JSContext *context = [webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//给这个上下文注入JS对象

context[@"nativeObj"] = self;

//给这个上下文注入callNativeFunction函数当做JS对象

context[@"callNativeFunction"] = ^( JSValue * data )

{

//1 解读JS传过来的JSValue数据

//2 取出指令参数,确认要发起的native调用的指令

//3 取出数据参数,拿到JS传过来的数据

//4 根据指令调用对应的native方法,传递数据

//5 此时还可以将客户端的数据同步返回

}

-(void)dosomething{}

// js代码

nativeObj.dosomething()

复制代码

WKWebView:

Native->JS

通过调用执行JS代码的API实现:

[webView evaluateJavaScript:@"document.title"

completionHandler:^(id _Nullable title, NSError * _Nullable error) {

}];

复制代码JS-> Native

依靠WKScriptMessageHandler协议类和WKUserContentController两个类:

WKUserContentController对象负责注册JS方法,设置处理接收JS方法的代理,代理遵守WKScriptMessageHandler,实现捕捉到JS消息的回调方法

WKUserContentController * wkUController = [[WKUserContentController alloc] init];

[wkUController addScriptMessageHandler:self name:@"jsCallNativeFuncName"];

config.userContentController = wkUController;

#pragma mark - WKScriptMessageHandler

// 通过接收JS传出消息的name进行捕捉的回调方法

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

{

// message.name ?= 'jsCallNativeFuncName'

SEL sel = NSSelectorFromString(message.name);

if ([_jsCallBack respondsToSelector:sel]) {

[_jsCallBack performSelector:sel];

} else {

NSLog(@"Not Found SEL:%@", message.name);

}

}

// 前端代码

window.webkit.messageHandlers.jsCallNativeFuncName.postMessage({});

复制代码

项目应用

针对我们工程现状的WK迁移方案总结

1.项目目录下扫描“UIWebview”,framework中的引用也可以检测出来

grep -r -n "UIWebView" ./

复制代码

2.API替换

初始化

config

delegate

对应API:

UIWebView

WKWebView

stringByEvaluatingJavaScriptFromString:

evaluateJavaScript: completionHandler:

shouldStartLoadWithRequest:

decidePolicyForNavigationAction:

3.兼容UIWebView中jsCallNative方法

通过js注入将WKWebView的js调用方式包装到UIWebView中原有的方法中,前端项目无需修改代码实现兼容

NSString *jsString = @"var nativeObj = new Object(); \

nativeObj.jsCallNativeFuncName = function(){ \

window.webkit.messageHandlers.jsCallNativeFuncName.postMessage({}); \

}";

WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jsString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];

[WKUserContentController addUserScript:wkUScript];

复制代码

4.关于cookie

/**

我们支持iOS11+,所以可以通过WKHTTPCookieStore以Config给webView注入已存在NSHTTPCookieStorage中的cookie

*/

+ (WKWebViewConfiguration *)wkWebViewConfiguration

{

WKWebViewConfiguration *configuration = [WKWebViewConfiguration new];

if (@available(iOS 11.0, *)) {

WKHTTPCookieStore *cookieStore = configuration.websiteDataStore.httpCookieStore;

NSArray *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies;

for (NSHTTPCookie *cookie in cookies) {

[cookieStore setCookie:cookie completionHandler:nil];

}

}

return configuration;

}

复制代码

参考链接

wkwebview替换uiwebview_项目笔记-UIWebView替换为WKWebView相关推荐

  1. 被替换的项目不是替换值长度的倍数_面试官,为啥HashMap的长度是2的n次方?

    前言 HashMap的主干是一个数组,假设我们有3个键值对dnf:1,cf:2,lol:3,每次放的时候会根据hash函数来确定这个键值对应该放在数组的哪个位置,即index = hash(key) ...

  2. 被替换的项目不是替换值长度的倍数_如果要在Excel中计算单元格内指定的字符长度,我推荐这两个公式.........

    在Excel中要计算单元格中的某个字有多少个,怎么能够快速得出来呢?一起来看看吧~ 例如,要计算下方表格的A1单元格有多少个"菠"字,有两种方法. 利用LEN函数和SUBSTITU ...

  3. wkwebview替换uiwebview_使用WKWebView替换UIWebView

    开发App的过程中,常常会遇到在App内部加载网页,通常用UIWebView加载.这个自iOS2开始使用的网页加载器一直是开发的心病:加载速度慢,占用内存多,优化困难.如果加载网页多,还可能因为过量占 ...

  4. idea使用jar包依赖,替换掉项目依赖

    idea使用jar包依赖,替换掉项目依赖 最近遇到了个问题,父子项目中,原本一个项目在idea下默认是项目依赖于另一个子项目,但是由于当前开发分支里不包含相应的代码,最新代码在别的分支,导致项目依赖时 ...

  5. Python笔记2_替换式文本加密

    本文为观看教学视频后的笔记整理,原教程来自哔哩哔哩爱可可爱生活 有时间的小伙伴可以去看一看,老师那里还有很多比较基础的教程 点击此处,进入Github获取下方代码的完整 JupyterNotebook ...

  6. 【无标题】加固替换Application学习笔记

    替换地方 protected void attachBaseContext(Context base)  base 也可以通过getBaseContext()获取 base.mOuterContext ...

  7. AppFuse项目笔记(1)

    AppFuse项目笔记(1) 一.Appfuse简介 Appfuse是Matt Raible 开发的一个指导性的入门级J2EE框架,它对如何集成流行的Spring.Hibernate.ibatis.s ...

  8. UNIAPP实战项目笔记43 购物车页面修改收货地址和修改默认地址

    UNIAPP实战项目笔记43 购物车页面修改收货地址和修改默认地址 实际案例图片 修改收货地址和修改默认地址页面布局和功能 具体内容图片自己替换哈,随便找了个图片的做示例 用到了vuex的状态机,具体 ...

  9. 瑞吉外卖项目笔记+踩坑1——基础功能

     导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 1 ...

最新文章

  1. excel生成sql
  2. 深入探讨this指针
  3. 操作系统--多进程管理CPU
  4. IIS rest服务delete 报错
  5. 技术剖析 | Axonius为什么能获得 2019 RSAC创新大奖 1
  6. 演练Ext JS 4.2自定义主题
  7. 如何用猿大师播放器把海康威视硬盘录像机截取MP4视频在web页面上回放?支持本地和远程视频吗?
  8. wps忘保存关闭,数据恢复步骤
  9. 填坑Ⅰ | 简单的数据结构
  10. 演讲稿:遇见下班加油站,开启改变之路(不喜者勿入)
  11. 苹果恢复出厂设置系统也会还原吗_刷机、恢复出厂设置和还原设置,你还不知道有什么区别?...
  12. RandomAccessFile类的readLine方法对文本文件中文字符读取显示乱码的问题及解决方法的深入分析
  13. 【连载】线性代数笔记——第二章矩阵2
  14. Vue - 调用接口导出 excel 表格至本地
  15. 用计算机怎样搜wifi网,如何用电脑设置wifi?用电脑设置wifi方法介绍
  16. 不小心格式化了硬盘怎么恢复?
  17. 大学自学html有前途吗,大学中最“牛逼”,最有前途的3个专业,考上就是金饭碗...
  18. ai人工智能将替代人类_教AI学习人类如何有效计划
  19. it计算机知识竞赛主持稿,IT知识竞赛活动策划.doc
  20. FreeMarker 数字格式处理

热门文章

  1. 【ps】修复老照片思路
  2. 超硬核分享,代码、模型全开源!检索、问答、情感分析全覆盖
  3. android cordova,android项目使用cordova
  4. 数三角形Triangel Counting UVa 11401()
  5. Dragonfly 和 Nydus Mirror 模式集成实践
  6. 电脑设备管理器和网络连接
  7. 浅学区块链(2)之solidity
  8. HTML input 标签的 所有type 属性及用法
  9. linux 服务器 1t 分区,Linux 服务器分区及挂载
  10. 视频二维码加密码(密码播放功能)