WKWebView与JS交互详情.

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MPK_Github/article/details/79940952


目录(?)[+]

WebKit(展示Web界面)

WebKit(WKScriptMessageHandler)

WebKit(WKUIDelegate)

WebKit(WKNavigationDelegate)

WebKit(刷新)

WebKit(导航)

WebKit(浏览记录)

WebKit(进度条)


上一篇博文《WebKit(展示Web界面)》讲解了显示Web页面,这一篇博文将讲解使用WKScriptMessageHandler完成JS交互。

在WKWebView中OC和JS交互也非常简单,WebKit库中有个代理WKScriptMessageHandler就是专门来做交互的。

1 WKScriptMessageHandler

1.1 WKScriptMessageHandler协议

WKScriptMessageHandler其实就是一个遵循的协议,它能让网页通过JS把消息发送给OC。其中协议方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

从协议中我们可以看出这里使用了两个类WKUserContentController和WKScriptMessage。WKUserContentController可以理解为调度器,WKScriptMessage则是携带的数据。

1.2 WKUserContentController

WKUserContentController有两个核心方法,也是它的核心功能。

  1. - (void)addUserScript:(WKUserScript *)userScript;: js注入,即向网页中注入我们的js方法,这是一个非常强大的功能,开发中要慎用。
  2. - (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;:添加供js调用oc的桥梁。这里的name对应WKScriptMessage中的name,多数情况下我们认为它就是方法名。

1.3 WKScriptMessage

WKScriptMessage就是js通知oc的数据。其中有两个核心属性用的很多。

  1. @property (nonatomic, readonly, copy) NSString *name; :对应- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;添加的name。
  2. @property (nonatomic, readonly, copy) id body;:携带的核心数据。

js调用时只需

  • 1

这里的name就是我们添加的name,是不是感觉很爽,就是这么简单,下面我们就来具体实现。

2 JS调用OC

2.1 配置WKUserContentController

要想使用WKUserContentController为web页面添加桥梁,只需配置到WKWebViewConfiguration即可。

下面改造webView方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.2 实现WKScriptMessageHandler

在当前页面引入WKScriptMessageHandler,并实现WKScriptMessageHandler协议即可。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.3 改造index.html页面

修改index.html的onClickButton()方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里我们为了测试效果传入了一个复杂的字典数据,而且字典中还有数组。input.value代表用户输入的数据。

这里使用了window.webkit.messageHandlers.jsCallOC.postMessage(dict);通知oc,jsCallOC这个属性就是前面我们通过WKUserContentController注入的。

2.4 测试交互

我们在viewDidLoad使用index.html页面完成测试。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行项目后,在页面的输入框中输入相应信息,点击确定按钮。即可在xcode中看见相关打印信息。

3 OC调用JS

3.1 OC通知JS

oc调用js就特别简单了,只需WKWebView调用- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ __nullable)(__nullable id, NSError * __nullable error))completionHandler;方法即可。

在上面的打印信息中,我们会发现我们还没有实现jsCallOC:方法,接下来我们在jsCallOC:方法中实现通知JS,并将用户输入的信息发送给JS。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.2 JS响应

OC将通知发送给JS后,JS要响应这个ocCallJS方法。我们在index.html中的onClickButton()方法下添加ocCallJS方法。

  • 1
  • 2
  • 3
  • 4

运行项目,在输入框输入信息后,点击确定按钮,会发现输入的信息在输入框下面显示出来。如图所示。

并在控制台看见如下打印信息。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4 WKUserScript JS注入

4.1 WKUserScript核心方法

在WebKit框架中,我们还可以预先添加JS方法,供其他人员调用。WKUserScript就是帮助我们完成JS注入的类,它能帮助我们在页面填充前或js填充完成后调用。核心方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.2 WKUserScriptInjectionTime枚举

在WKUserScriptInjectionTime枚举中有两个状态。

  1. WKUserScriptInjectionTimeAtDocumentStart:js加载前执行。
  2. WKUserScriptInjectionTimeAtDocumentEnd:js加载后执行。

4.3 js注入

WKUserScript的运行需依托WKUserContentController,接下来我们就为WKWebView注入一个js执行完毕后执行的alert方法。

改造- (WKWebView *)webView方法。


目录(?)[+]

WebKit(展示Web界面)

WebKit(WKScriptMessageHandler)

WebKit(WKUIDelegate)

WebKit(WKNavigationDelegate)

WebKit(刷新)

WebKit(导航)

WebKit(浏览记录)

WebKit(进度条)


上一篇博文《WebKit(展示Web界面)》讲解了显示Web页面,这一篇博文将讲解使用WKScriptMessageHandler完成JS交互。

在WKWebView中OC和JS交互也非常简单,WebKit库中有个代理WKScriptMessageHandler就是专门来做交互的。

1 WKScriptMessageHandler

1.1 WKScriptMessageHandler协议

WKScriptMessageHandler其实就是一个遵循的协议,它能让网页通过JS把消息发送给OC。其中协议方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

从协议中我们可以看出这里使用了两个类WKUserContentController和WKScriptMessage。WKUserContentController可以理解为调度器,WKScriptMessage则是携带的数据。

1.2 WKUserContentController

WKUserContentController有两个核心方法,也是它的核心功能。

  1. - (void)addUserScript:(WKUserScript *)userScript;: js注入,即向网页中注入我们的js方法,这是一个非常强大的功能,开发中要慎用。
  2. - (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;:添加供js调用oc的桥梁。这里的name对应WKScriptMessage中的name,多数情况下我们认为它就是方法名。

1.3 WKScriptMessage

WKScriptMessage就是js通知oc的数据。其中有两个核心属性用的很多。

  1. @property (nonatomic, readonly, copy) NSString *name; :对应- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;添加的name。
  2. @property (nonatomic, readonly, copy) id body;:携带的核心数据。

js调用时只需

  • 1

这里的name就是我们添加的name,是不是感觉很爽,就是这么简单,下面我们就来具体实现。

2 JS调用OC

2.1 配置WKUserContentController

要想使用WKUserContentController为web页面添加桥梁,只需配置到WKWebViewConfiguration即可。

下面改造webView方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.2 实现WKScriptMessageHandler

在当前页面引入WKScriptMessageHandler,并实现WKScriptMessageHandler协议即可。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.3 改造index.html页面

修改index.html的onClickButton()方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里我们为了测试效果传入了一个复杂的字典数据,而且字典中还有数组。input.value代表用户输入的数据。

这里使用了window.webkit.messageHandlers.jsCallOC.postMessage(dict);通知oc,jsCallOC这个属性就是前面我们通过WKUserContentController注入的。

2.4 测试交互

我们在viewDidLoad使用index.html页面完成测试。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行项目后,在页面的输入框中输入相应信息,点击确定按钮。即可在xcode中看见相关打印信息。

3 OC调用JS

3.1 OC通知JS

oc调用js就特别简单了,只需WKWebView调用- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ __nullable)(__nullable id, NSError * __nullable error))completionHandler;方法即可。

在上面的打印信息中,我们会发现我们还没有实现jsCallOC:方法,接下来我们在jsCallOC:方法中实现通知JS,并将用户输入的信息发送给JS。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.2 JS响应

OC将通知发送给JS后,JS要响应这个ocCallJS方法。我们在index.html中的onClickButton()方法下添加ocCallJS方法。

  • 1
  • 2
  • 3
  • 4

运行项目,在输入框输入信息后,点击确定按钮,会发现输入的信息在输入框下面显示出来。如图所示。

并在控制台看见如下打印信息。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4 WKUserScript JS注入

4.1 WKUserScript核心方法

在WebKit框架中,我们还可以预先添加JS方法,供其他人员调用。WKUserScript就是帮助我们完成JS注入的类,它能帮助我们在页面填充前或js填充完成后调用。核心方法。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.2 WKUserScriptInjectionTime枚举

在WKUserScriptInjectionTime枚举中有两个状态。

  1. WKUserScriptInjectionTimeAtDocumentStart:js加载前执行。
  2. WKUserScriptInjectionTimeAtDocumentEnd:js加载后执行。

4.3 js注入

WKUserScript的运行需依托WKUserContentController,接下来我们就为WKWebView注入一个js执行完毕后执行的alert方法。

改造- (WKWebView *)webView方法。

猜你喜欢

转载自blog.csdn.net/MPK_Github/article/details/79940952
今日推荐