因為公司產品需求,需要支持UIWebView/WKWebView與web進行協議回調。
web端觸發方法
屏幕快照 2018-04-12 下午11.12.45.png
屏幕快照 2018-04-12 下午11.12.45.png
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;
}