iOS WKWebView与H5交互,监听页面URL变化、接收H5传值、传值给H5。


#define URL_define @"URL"
// 添加监听当前url
-(void)addwebViewKVOUrl
{
     [self.webview addObserver:self forKeyPath:URL_define options:NSKeyValueObservingOptionNew context:nil];
}

// KVO 方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"URL"])
    {
        NSLog(@" 当前 URL------%@",self.webview.URL.absoluteString);
    }
}

-(void)removeWebViewKVOUrl
{
     [self.webview removeObserver:self forKeyPath:URL_define];
}

// ---------------------接收前端参数----------------------

/// 添加 js 接收消息方法
/// 前端 发消息给客户端方法 window.webkit.messageHandlers.与后台约定的方法名.postMessage(传的参数);
/// @param name  方法名 与前端协商好一个字符串 就可以了
-(void)addJSMessageFromName:(NSString *)name
{
    [self.webview.configuration.userContentController  addScriptMessageHandler:self name:name];
}

/*
 接收H5 消息的方法
 需要指定 WKScriptMessageHandler 代理
 */
-(void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message
{
    NSLog(@"h5 name %@",message.name);
    NSLog(@"h5 body %@",message.body);
}

-(void)removeJSMessageFromName:(NSString *)name
{
    [self.webview.configuration.userContentController removeScriptMessageHandlerForName:name];
}

// ----------------- 给前端发消息 -------------------------
-(void)sendMessageToJSFromNme:(NSString *)name data:(id)data
{
    NSString * jsStr = [NSString stringWithFormat:@"%@('%@')",name,data];
    [self.webview evaluateJavaScript:jsStr completionHandler:^(id _Nullable response, NSError * _Nullable error) {
       if (!error)
        {
         NSLog(@"成功 = %@",response);
        }
        else
        {
         NSLog(@"失败 = %@",error.localizedDescription);
         }
    }];
}


-(WKWebView *)webview{
    if (!_webview)
    {
        WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
        config.selectionGranularity = WKSelectionGranularityDynamic;
        config.allowsInlineMediaPlayback = YES;
        WKPreferences *preferences = [WKPreferences new];
        preferences.javaScriptEnabled = YES;
        preferences.javaScriptCanOpenWindowsAutomatically = YES;
        config.preferences = preferences;
        CGRect frem = self.view.frame;
        WKWebView * webview = [[WKWebView alloc] initWithFrame:frem configuration:config];
        webview.navigationDelegate = self;
        webview.UIDelegate = self;
        _webview = webview;
    }
    return _webview;
}

// ------------------ 调用 -------------------------

#define MessageName @"resiveMessage"
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self addwebViewKVOUrl];
    [self addJSMessageFromName:MessageName];
}

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [self removeWebViewKVOUrl];
    [self removeJSMessageFromName:MessageName];
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值