关于UIWebView、WKWebView 协议问题

因为公司产品需求,需要支持UIWebView/WKWebView与web进行协议回调。

web端触发方法
关于UIWebView、WKWebView 协议问题_第1张图片
屏幕快照 2018-04-12 下午11.12.45.png

UIWebView 协议

需要导入头文件
#import 
遵守协议WKScriptMessageHandler

声明协议
//首先创建一个实现了JSExport协议的协议
@protocol LivePullJSObjextProtocol 
- (void)openLive:(int)isOpenInfo;
@end

- (void)webViewDidFinishLoad:(YXTCoreWebView *)webView
{
    if ([self.webView.realWebView isKindOfClass:[UIWebView class]]) {//UI
        //1,得到JSContext 固定语句 获取该UIWebview的javascript执行环境。
        JSContext *context = [webView.realWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        //需要先注入方法,再注册协议
        context[@"appSDK"] = self;//appSDK是web触发的方法调用的方法
    }
}

实现协议
- (void)openLive:(int)isOpenInfo {
}

WKWebView 协议

- (void)userContentController:(WKUserContentController *)userContentController
      didReceiveScriptMessage:(WKScriptMessage *)message {
    if ([message.name isEqualToString:@"openLive"]) {
        ///协议
        [self openLive:[message.body intValue] ];
    }
}

在使用WKWebView进行页面加载时,直接链接可以加载,但是点击web界面的按钮却未走协议,刚开始以为是前端不支持WKWebView,后来发现是我们自己有的代理没实现
要进入新界面WKWebView需要实现一个代理:
//1.创建一个新的WebVeiw

- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{
    if (!navigationAction.targetFrame.isMainFrame) {
        [webView loadRequest:navigationAction.request];
        
        NSLog(@"url:%@",navigationAction.request.URL.absoluteString);
        
    }
    return nil;
}

你可能感兴趣的:(关于UIWebView、WKWebView 协议问题)