? ? ? ? 首先創(chuàng)建一個WKWebView對象:initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration*)configuration,從這里面可以看出我們需要傳入一個WKWebViewConfiguration對象赏寇,這里的WKWebViewConfiguration其實就是設置一些webView的配置信息羽戒,在他的屬性里面我們可以看到WKPreferences *preferences拇涤,這就是設置偏好配置信息。
//創(chuàng)建配置信息對象
WKWebViewConfiguration*config=[[WKWebViewConfiguration alloc]init];
// 創(chuàng)建偏好設置對象
WKPreferences*preference=[[WKPreferences alloc]init];
//最小字體大小 當將javaScriptEnabled屬性設置為NO時鸟廓,可以看到明顯的效果preference.minimumFontSize=0;
//設置是否支持javaScript 默認是支持的preference.javaScriptEnabled=YES;
// 在iOS上默認為NO仁卷,表示是否允許不經(jīng)過用戶交互由javaScript自動打開窗口,這里設置并沒有什么用舞痰,后面再補充說一下
preference.javaScriptCanOpenWindowsAutomatically=YES;
config.preferences=preference;
WKWebView *wkWeb = [[WKWebView alloc] initWithFrame:rect configuration:config];
wkWeb.UIDelegate = self;
wkWeb.navigationDelegate = self;
// 設置是否允許左滑返回
wkWeb.allowsBackForwardNavigationGestures = YES;
[self.view addSubview:wkWeb];
NSString *path = [[NSBundle mainBundle] pathForResource:@"WKWeb.html" ofType:nil];
NSString *htmlString = [[NSString alloc]initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
[wkWeb loadHTMLString:htmlString baseURL:nil];
????????到這里一個網(wǎng)頁就可加載出來了弃酌,下面說一下OC和JS的交互氨菇。在WKWebViewConfiguration類中有個WKUserContentController類對象儡炼,這個類主要用來與JavaScript的交互管理。
?WKUserContentController * wkUserController = [[WKUserContentController alloc] init];
// js掉起oc步驟查蓉,注冊一個name為jsToOcNoPrams的js方法乌询,設置處理接收JS方法的代理
[wkUController addScriptMessageHandler:self? name:@"jsToOcWithPrams"];
config.userContentController= wkUController;
// 這里在js中調(diào)用我們注冊的方法jsToOcWithPrams,這里還可以傳參數(shù)
window.webkit.messageHandlers.jsToOcWithPrams.postMessage('https://www.baidu.com/');
// 這里實現(xiàn)代理方法,注意這里遵守WKScriptMessageHandler協(xié)議豌研,代理是由WKUserContentControl設置 妹田,通過接收JS傳出消息的name進行捕捉的回調(diào)方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
? ???????//用message.body獲得JS傳過來的參數(shù)
? ? ????NSString* parameter = message.body;
? ??????if([message.name isEqualToString:@"jsToOcWithPrams"]){
? ? ? ? ? ? // 頁面按鈕點擊js響應,這里做對應的處理
????????}
}
// oc調(diào)用js方法
[wkWeb evaluateJavaScript:@"ocToJs('我傳參數(shù)了......')" completionHandler:^(idresponse, NSError *error) {}];
// 在js里面實現(xiàn)ocToJs方法
function?ocToJs(text){
console.log(text);
// 這里做一個屬性測試javaScriptCanOpenWindowsAutomatically
window.open('https://www.baidu.com/');
}
? ?這里最后說一下WKWebView默認是不支持window.open()打開新的頁面鹃共,javaScriptCanOpenWindowsAutomatically屬性默認是NO鬼佣,設置為YES也并沒有反應,這里可以實現(xiàn)下面方法即可使用window.open('https://www.baidu.com/');打開新的網(wǎng)頁霜浴。
- (WKWebView*)webView:(WKWebView*)webView? createWebViewWithConfiguration:(WKWebViewConfiguration*)configuration? forNavigationAction:(WKNavigationAction*)navigationAction windowFeatures:(WKWindowFeatures*)windowFeatures{
? ? if(navigationAction.targetFrame==nil|| !navigationAction.targetFrame.isMainFrame)
? ? {
? ? ? ? [webView loadRequest:navigationAction.request];
? ? }
? ? return nil;
}
? ? ? ? 最后補充沮趣,由UIWebView換為WKWebView后,會發(fā)現(xiàn)字體小了很多坷随,這應該是WKWebView與html的兼容問題,解決辦法是修改原網(wǎng)頁驻龟,要么我們手動注入JS温眉,下面代碼適配文本大小
? ? NSString *jSString = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
//用于進行JavaScript注入
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jSString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[config.userContentController addUserScript:wkUScript];