因为公司产品需求,需要支持UIWebView/WKWebView与web进行协议回调。
web端触发方法
UIWebView 协议
需要导入头文件
#import <JavaScriptCore/JavaScriptCore.h>
遵守协议WKScriptMessageHandler
声明协议
//首先创建一个实现了JSExport协议的协议
@protocol LivePullJSObjextProtocol <JSExport>
- (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;
}