博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS WKWebView和JS交互的两种方式
阅读量:5975 次
发布时间:2019-06-19

本文共 3040 字,大约阅读时间需要 10 分钟。

hot3.png

本文介绍两种方式实现iOS WKWebView和JS交互

  • WKWebViewConfiguration注入WKScriptMessageHandler
  • UIWebViewDelegate回调方法中处理

WKWebViewConfiguration注入WKScriptMessageHandler

网页很简单,只有一个按钮,点击按钮会触发一个方法,在事件的方法中通过调用 window.webkit.messageHandlers.NativeModel.postMessage({name: 'zhangyutang', age: 12}); 把消息发送给Objc。Objc中需要注入相同名称的model:NativeModel。网页代码如下

    
html5page-oc

Objc代码中在初始化WKWebView的时候需要使用initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration方法来进行初始化。 WKWebViewConfiguration对象需要使用调用方法 addScriptMessageHandler:name 来设置JS事件的接收处理器,addScriptMessageHandler:name方法有两个参数:ScriptMessageHandler参数需要是一个实现WKScriptMessageHandler了协议的对象;name参数是H5页面中调用postMessage方法使用到的注入对象的名称,H5页面和原生的页面交互使用通过该对象才可以成功调用。

- (WKWebView *)webView {    if (!_webView) {        WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init];        config.userContentController = [WKUserContentController new];        [config.userContentController addScriptMessageHandler:self name:@"NativeModel"];        _webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];        _webView.navigationDelegate = self;    }    return _webView;}

MMWebViewController类实现了实现 WKScriptMessageHandler 协议,重写 userContentController:didReceiveScriptMessage回调方法 ,在该方法中处理JS的方法调用,关键的代码片段如下。

@interface MMWebViewController () 
@end@implementation MMWebViewController#pragma mark - ......::::::: WKScriptMessageHandler :::::::......- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { id body = message.body; NSLog(@"=== %@", body);}@end

UIWebViewDelegate回调方法中处理

重写UIWebViewDelegate的回调方法- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler,在该方法中通过判断请求的URL的scheme来处理特定URL,可以处理原生页面的跳转、原生页面的弹窗等业务逻辑,然后调用decisionHandler(WKNavigationActionPolicyCancel);告诉WKWebView不用处理这个请求,这个请求已经让原生处理了。简单的代码片段如下

if ([navigationAction.request.URL.scheme isEqualToString:@"plush"]) {        [PTLinkUtil handleURLString:navigationAction.request.URL.absoluteString linkType:PTLinkCustomHandler roomID:0];        decisionHandler(WKNavigationActionPolicyCancel);        return;    } else if ([[navigationAction.request.URL.scheme lowercaseString] isEqualToString:@"lezhua"]) {        if ([[navigationAction.request.URL.host lowercaseString] isEqualToString:@"home"]) {            NSArray *queryItems = [NSURLComponents componentsWithString:navigationAction.request.URL.absoluteString].queryItems;            for (NSInteger i = 0; i < queryItems.count; i++) {                NSURLQueryItem *loopItem = queryItems[i];                if ([[loopItem.name lowercaseString] isEqualToString:@"segmentid"]) {                    [UIUtil showWithSegmentID:[validString(loopItem.value) integerValue]];                }            }        }        decisionHandler(WKNavigationActionPolicyCancel);        return;    }

转载于:https://my.oschina.net/FEEDFACF/blog/841472

你可能感兴趣的文章
安装python3.5注意事项及相关命令
查看>>
进程通信之无名信号量
查看>>
并发串行调用接口
查看>>
C# 视频监控系列 序 [完]
查看>>
Mongodb3.0.5副本集搭建及spring和java连接副本集配置
查看>>
FileStream大文件复制
查看>>
TDD 的本质不是 TDD
查看>>
linux命令学习——ps
查看>>
freemark 判断list是否为空
查看>>
JS的一些扩展:String、StringBuilder、Uri
查看>>
solr的suggest模块
查看>>
2PHP页面缓存
查看>>
编译原理 LL1文法First集算法实现
查看>>
菜鸟学Linux命令:bg fg jobs命令 任务管理
查看>>
python 多线程就这么简单(续)
查看>>
【Linux系统编程】 Linux系统调用概述
查看>>
SQL Server Reporting Services:无法检索应用程序文件。部署中的文件已损坏
查看>>
hive中partition如何使用
查看>>
查看mysql数据库版本方法总结
查看>>
大牛手把手教你做日历(建议你看看,你会有收获的)
查看>>