關于UIWebView、WKWebView 協議問題

因為公司產品需求,需要支持UIWebView/WKWebView與web進行協議回調。

web端觸發方法
屏幕快照 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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容