iOS WKWebView JS 与 原生交互小结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS WKWebView JS 与 原生交互小结相关的知识,希望对你有一定的参考价值。

参考技术A

目前iOS项目中 Webview 几乎都会用到,iOS 8 之前使用UIWebView,iOS 8 之后 Apple 就不推荐使用了,目前已经放弃了,如果项目中存在就无法上架了,需要转为WKWebView了,说实话 UIWebView 是有性能上的缺陷,内存优化不够友好等,但是不得不说这是老的iOS开发人员用的最熟练熟悉的了,用起来得心应手。非迫不得已还真不愿转到WKWebView。好吧,既然已经这样了,又何必苦苦单恋一支花呢?

看了网上教程很多,自己使用小结一下,简单易用,本文适用于菜鸟级开发,废话不说了,

最主要的方法:发送消息

注意:对象名和方法名jumpUserProtocol名字的一致,参数可以是常用的NSArray,NSDictionary等类型,先说下在这个Demo中其实没用上,用的方法名判断的。

注意: addScriptMessageHandler

name为方法名 ,和JS 中的保持一致,添加脚本,相当于给Webview添加一个监听,有这个功能来处理JS。

在WKScriptMessageHandler代理方法中处理回调,实现自己的逻辑。

上面就是JS调用OC原生实现。

这个其实很简单,就一个方法:

iOS WKWebView与H5交互,JS调OC传值、OC调JS传值、进度条加载等(干货满满)

参考技术A WKWebView是苹果在iOS 8之后推出的框架,关于它比webview的优势这里就不讲了。主要说一下与JS交互的问题,其实WKWebView已经内置了JS与OC的互调、传值等方法,使用起来也非常方便,下面就来细细的探讨一下以及自己遇到过的坑...

首先来看下WKWebView的初始化相关设置:

一、导入相关头文件、设置相关代理和属性

二、WKWebView初始化

注意:
楼主遇到的第一个坑:如果JS给OC传值为空,必须写成: postMessage(null),如果什么都不写,方法是调不通的。

1、在viewWillAppear中配置, addScriptMessageHandler name: "这里就是JS的方法,方法名必须统一"

楼主遇到的第二个坑:配置完后必须在 viewWillDisappear 中 remove,否则会造成循环引用,导致crash

2、实现 WKScriptMessageHandler 协议

以上就是JS调OC,JS向OC传值...

楼主这里举三个例子:
1: webview加载完成前,将用户信息传给js
2: webview加载完成,将相关信息传给js
3: 调用相册或相机时,将选择的图片请求后台接口,后台返回图片地址,将该地址回传给H5,H5将图片显示到页面上

第一个例子: webView加载完成前传值
因为 evaluateJavaScript 方法默认是在加载完成后调用,所以直接在页面开始加载中调用是传不过去的,这个时候怎么办呢? 我们可以让js端写两个方法, 第一个方法是js端开始向oc端发起信息需求的方法名,当oc端收到该方法名的时候,就去调用js端第二个获取传值的方法,把信息传递过去。

先让JS端写个方法调OC,OC实现方法后在这个方法内部给JS传值

在WKScriptMessageHandler协议中,实现该方法,然后在方法内部给JS传值

注意: 以上就是在Webview加载完成前传值,如果打印没报错,证明传参成功,如果web端没收到,让他把获取到值的方法写到页面中即可。

第二个例子: webView加载完成,传值给js

第三个例子: 传图片地址给js,js拿到后显示图片

1:拍照事件

1.1:将拍的照片请求上传图片接口,成功返回图片地址,并传值给H5

2: 从相册中选取照片

2.2:将相册中选取的照片请求上传图片接口,成功返回图片地址,并传值给H5

注意: getPhotoCallback 即为调用的方法名,后面传值格式必须为: ('') , 这里遇到了第三个坑, 如果方法名写为: 名称.名称 (例如:hello. getPhotoCallback),这种是调不通的,可以写成hello_getPhotoCallback的形式,一般的话最好还是定义一个完整的名称。 刚开始这个问题卡了比较久,一直调不通,在此记录一下.....

在 viewDidLoad 中注册进度条监听

开始加载网页

加载完成

加载失败

页面跳转失败

progressView懒加载

添加监听观察者

最后别忘记 removeObserver

Demo地址: https://github.com/zhwIdea/WKWebViewAndJS

以上是关于iOS WKWebView JS 与 原生交互小结的主要内容,如果未能解决你的问题,请参考以下文章

iOS下JS与原生的交互二

js与oc原生WKWebView交互传值

js与oc原生WKWebView交互传值

H5与原生APP交互方式 (IOS及安卓)

iOS开发漫话WKWebView之给H5网页图片添加点击事件以实现原生图片预览

swift 笔记:iOS与JavaScript的交互(三):WKWebView 3. WKUiDelegate - 6 - 5原生利用Dictionary来转换