WKWebView 對象可以顯示交互式Web內(nèi)容,例如應(yīng)用內(nèi)瀏覽器。你可以使用 WKWebView 類將Web內(nèi)容嵌入到你的應(yīng)用程序中。 為此,創(chuàng)建一個 WKWebView 對象,像設(shè)置視圖一樣設(shè)置它,并向其發(fā)送加載Web內(nèi)容的請求。
預(yù)覽
重要
從 iOS 8.0 和 OS X 10.10 開始,在你的APP中使用 WKWebView 添加網(wǎng)頁內(nèi)容,不要使用 UIWebView 或 WebView。
使用 initWithFrame:configuration: 方法創(chuàng)建了一個新的 WKWebView 對象之后,你需要加載web內(nèi)容。使用 loadHTMLString:baseURL: 方法加載本地 HTML 文件或者使用 loadRequest: 方法開始加載 web 內(nèi)容。使用 stopLoading 方法停止加載,并且使用 loading 屬性查看 web 視圖是否正在加載中。為對象設(shè)置委托屬性以遵守 WKUIDelegate 協(xié)議,以跟蹤Web內(nèi)容的加載。
要允許用戶在 web 歷史頁面中前進(jìn)或者后退,為按鈕設(shè)置使用 goBack和goForward方法的動作。當(dāng)用戶不能在某個方向上再移動時,使用canGoBack和canGoForward屬性禁用按鈕。
默認(rèn)情況下,web 視圖會自動將出現(xiàn)在 web 內(nèi)容中的電話號碼轉(zhuǎn)換為電話鏈接。當(dāng)電話鏈接被點(diǎn)擊時,電話應(yīng)用程序就會啟動并撥打該號碼。要關(guān)閉這個默認(rèn)的行為,用 WKDataDetectorTypes 設(shè)置 dataDetectorTypes 屬性以不包含 WKDataDetectorTypePhoneNumber 標(biāo)志。
你還可以使用 setMagnification:centeredAtPoint: 以編程方式設(shè)置Web內(nèi)容第一次在Web視圖中顯示的縮放比例。 此后,用戶可以使用手勢來改變比例。
Symbols
初始化web視圖
-
configuration
用于初始化Web視圖的配置副本。 -
- initWithFrame:configuration:
用指定的 frame 和 configuration 初始化web視圖 。 - initWithCoder:
查看web信息
-
scrollView
與web視圖相關(guān)聯(lián)的滾動視圖。 -
title
頁面標(biāo)題。 -
URL
活動網(wǎng)址。 -
customUserAgent
自定義用戶代理字符串。 -
serverTrust
用于當(dāng)前待導(dǎo)航的 SecTrustRef 對象。
設(shè)置委托
-
navigationDelegate
web視圖的導(dǎo)航代理。 -
UIDelegate
web視圖的用戶界面委托。
加載內(nèi)容
-
estimatedProgress
當(dāng)前導(dǎo)航的哪幾個部分已經(jīng)加載的估計(jì)值(double:0.0~1.0)。 -
hasOnlySecureContent
布爾值,指示頁面上的所有資源是否通過安全加密的連接加載。 -
- loadHTMLString:baseURL:
設(shè)置網(wǎng)頁內(nèi)容和 base URL。 -
loading
布爾值,顯示當(dāng)前視圖是否正在加載。 -
- reload
重新加載當(dāng)前頁面 -
- reloadFromOrigin
重新加載當(dāng)前頁面,如果可能,使用緩存驗(yàn)證條件執(zhí)行端到端重新驗(yàn)證。 -
- stopLoading
停止加載當(dāng)前頁面所有資源。 -
- loadData:MIMEType:characterEncodingName:baseURL:
設(shè)置網(wǎng)頁內(nèi)容和 base URL。 -
- loadFileURL:allowingReadAccessToURL:
找到文件系統(tǒng)上所請求的文件URL
縮放內(nèi)容
-
allowsMagnification
布爾值,表示放大手勢是否會改變網(wǎng)頁視圖的放大倍數(shù)。 -
magnification
頁面內(nèi)容當(dāng)前縮放因子。 -
- setMagnification:centeredAtPoint:
按指定的因子縮放頁面內(nèi)容,并將結(jié)果居中在指定的點(diǎn)上。
導(dǎo)航
-
allowsBackForwardNavigationGestures
布爾值,指示水平滑動手勢是否會觸發(fā)后退列表導(dǎo)航。默認(rèn)為:NO。 -
backForwardList
網(wǎng)頁視圖的后退列表。(之前訪問過的 web 頁面的列表) -
canGoBack
布爾值,指示后退列表中是否有可被導(dǎo)航到的后退項(xiàng)。 -
canGoForward
布爾值,指示后退列表中是否有可導(dǎo)航的前進(jìn)項(xiàng)。 -
allowsLinkPreview
布爾值,用于確定是否按下鏈接可以顯示鏈接目標(biāo)的預(yù)覽。 -
- goBack
導(dǎo)航到后退列表中的后退項(xiàng)中。 -
- goForward
導(dǎo)航到后退列表中的前進(jìn)項(xiàng)中。 -
- goToBackForwardListItem:
導(dǎo)航到后退列表中的某一個網(wǎng)頁項(xiàng),并將其設(shè)置為當(dāng)前項(xiàng)。 -
- loadRequest:
導(dǎo)航到請求的URL地址
執(zhí)行 JavaScript
-
- evaluateJavaScript:completionHandler:
評估 JavaScript 字符串。Objective-C 調(diào)用 JavaScript 方法。
實(shí)例方法
-
- goBack
導(dǎo)航到后退列表中的后退項(xiàng)中。 -
- goForward
導(dǎo)航到后退列表中的前進(jìn)項(xiàng)中。 -
- reload
重新加載當(dāng)前頁面 -
- reloadFromOrigin
重新加載當(dāng)前頁面,如果可能,使用緩存驗(yàn)證條件執(zhí)行端到端重新驗(yàn)證。 -
- stopLoading
停止加載當(dāng)前頁面所有資源。
WKWebViewConfiguration API
用于初始化Web視圖的屬性集合。
預(yù)覽
使用 WKWebViewConfiguration 類,你可以確定網(wǎng)頁呈現(xiàn)的速度,媒體播放的處理方式,用戶可以選擇的項(xiàng)目的粒度等等。
WKWebViewConfiguration 僅在首次初始化Web視圖時使用。 當(dāng)web視圖被創(chuàng)建以后,你就無法再使用此類來更改Web視圖的配置信息了。
Symbols
配置新的Web視圖的屬性
-
applicationNameForUserAgent
在用戶代理字符串中使用的應(yīng)用程序的名稱。 -
preferences
Web視圖要使用的首選項(xiàng)對象。 -
processPool
從中獲取視圖的Web內(nèi)容進(jìn)程的進(jìn)程池。 -
userContentController
與網(wǎng)頁視圖關(guān)聯(lián)的用戶內(nèi)容控制器。 -
websiteDataStore
由網(wǎng)頁視圖使用的存儲的網(wǎng)站數(shù)據(jù)。
確定頁面可擴(kuò)展性
-
ignoresViewportScaleLimits
布爾值,用于確定 WKWebView 對象是否應(yīng)始終允許縮放網(wǎng)頁。
設(shè)置渲染首選項(xiàng)
-
suppressesIncrementalRendering
布爾值,指示網(wǎng)絡(luò)視圖是否在【內(nèi)容渲染完全加載到內(nèi)存之前】禁止內(nèi)容呈現(xiàn)。默認(rèn)值:NO。
設(shè)置媒體播放首選項(xiàng)
allowsInlineMediaPlayback
布爾值,指示HTML5視頻是否內(nèi)嵌播放或使用native全屏控制器。allowsAirPlayForMediaPlayback
是否允許 AirPlay。allowsPictureInPictureMediaPlayback
HTML5視頻是否可以播放畫中畫。mediaTypesRequiringUserActionForPlayback
確定哪些媒體類型需要用戶手勢才能開始播放。-
WKAudiovisualMediaTypes
枚舉類型:需要用戶手勢開始播放的媒體類型typedef enum WKAudiovisualMediaTypes : NSUInteger { WKAudiovisualMediaTypeNone = 0, WKAudiovisualMediaTypeAudio = 1 << 0, WKAudiovisualMediaTypeVideo = 1 << 1, WKAudiovisualMediaTypeAll = NSUIntegerMax } WKAudiovisualMediaTypes;
設(shè)置選擇粒度
-
selectionGranularity
用戶可以在網(wǎng)頁視圖中交互地選擇內(nèi)容的粒度級別。 -
WKSelectionGranularity
枚舉類型:交互式創(chuàng)建和修改選擇的粒度。typedef enum WKSelectionGranularity : NSInteger { WKSelectionGranularityDynamic, //選擇粒度根據(jù)選擇而自動變化。 WKSelectionGranularityCharacter //選擇端點(diǎn)可以放置在任何字符邊界上 } WKSelectionGranularity;
選擇用戶界面方向
userInterfaceDirectionPolicy
用戶界面元素的方向。-
WKUserInterfaceDirectionPolicy
枚舉類型:用于確定Web視圖中用戶界面元素的方向性策略。typedef enum WKUserInterfaceDirectionPolicy : NSInteger { WKUserInterfaceDirectionPolicyContent, // 方向遵循CSS / HTML / XHTML規(guī)范 WKUserInterfaceDirectionPolicySystem // 方向遵循視圖的userInterfaceLayoutDirection屬性 } WKUserInterfaceDirectionPolicy;?
識別數(shù)據(jù)類型
dataDetectorTypes
所需的數(shù)據(jù)檢測類型。-
WKDataDetectorTypes
枚舉類型:檢測到的數(shù)據(jù)類型。typedef enum WKDataDetectorTypes : NSUInteger { WKDataDetectorTypeNone = 0, WKDataDetectorTypePhoneNumber = 1 << 0, WKDataDetectorTypeLink = 1 << 1, WKDataDetectorTypeAddress = 1 << 2, WKDataDetectorTypeCalendarEvent = 1 << 3, WKDataDetectorTypeTrackingNumber = 1 << 4, WKDataDetectorTypeFlightNumber = 1 << 5, WKDataDetectorTypeLookupSuggestion = 1 << 6, WKDataDetectorTypeAll = NSUIntegerMax, WKDataDetectorTypeSpotlightSuggestion = WKDataDetectorTypeLookupSuggestion } WKDataDetectorTypes;?
WKNavigationDelegate API
WKNavigationDelegate 協(xié)議方法可以幫助你實(shí)現(xiàn)在Web視圖接受,加載和完成導(dǎo)航請求的過程中觸發(fā)的自定義行為。
初始化導(dǎo)航和跟蹤加載進(jìn)度
// 頁面開始加載 web 內(nèi)容時調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// 當(dāng) web 內(nèi)容開始返回時調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 頁面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 頁面加載失敗時調(diào)用 ( web 視圖加載內(nèi)容時發(fā)生錯誤)
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error;
// web 視圖導(dǎo)航過程中發(fā)生錯誤時調(diào)用。
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error;
// 當(dāng) Web 視圖的 Web 內(nèi)容進(jìn)程終止時調(diào)用。
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView;
導(dǎo)航錯誤:NSURLErrorDomain Code=-999
原因:webview 的上一個請求還沒有加載完成,下一個請求發(fā)起了,此時 webview 會取消掉之前的請求,因此會回調(diào)導(dǎo)航失敗錯誤(NSURLErrorCancelled = -999)。
響應(yīng)服務(wù)器操作
// 收到服務(wù)器重定向之后調(diào)用 (接收到服務(wù)器跳轉(zhuǎn)請求)
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
實(shí)例方法
-
- webView:didReceiveAuthenticationChallenge:completionHandler:
當(dāng) Web 視圖需要響應(yīng)認(rèn)證挑戰(zhàn)(authentication challenge)時調(diào)用。
當(dāng)使用 HTTPS 協(xié)議加載 web 內(nèi)容時,使用的證書不合法或者證書過期時需要使用該方法:
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
if ([challenge previousFailureCount] == 0) {
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
} else {
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
}
} else {
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
}
}
允許導(dǎo)航
通常用于處理跨域的鏈接能否導(dǎo)航
// 在發(fā)送請求之前,決定是否允許或取消導(dǎo)航。
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSLog(@"%s", __FUNCTION__);
// 如果請求的是百度地址,則允許跳轉(zhuǎn)
if ([navigationAction.request.URL.host.lowercaseString isEqual:@"www.baidu.com"]) {
// 允許跳轉(zhuǎn)
decisionHandler(WKNavigationActionPolicyAllow);
return;
}
// 否則不允許跳轉(zhuǎn)
decisionHandler(WKNavigationActionPolicyCancel);
}
// 收到響應(yīng)后,決定是否允許或取消導(dǎo)航。
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
NSLog(@"%s", __FUNCTION__);
// 如果響應(yīng)的地址是百度,則允許跳轉(zhuǎn)
if ([navigationResponse.response.URL.host.lowercaseString isEqual:@"www.baidu.com"]) {
// 允許跳轉(zhuǎn)
decisionHandler(WKNavigationResponsePolicyAllow);
return;
}
// 否則不允許跳轉(zhuǎn)
decisionHandler(WKNavigationResponsePolicyCancel);
}
導(dǎo)航策略
-
WKNavigationActionPolicy
從decisionPolicyForNavigationAction:decisionHandler:方法返回的決定策略。typedef enum WKNavigationActionPolicy : NSInteger { WKNavigationActionPolicyCancel, WKNavigationActionPolicyAllow } WKNavigationActionPolicy; -
WKNavigationResponsePolicy
從webView:decidePolicyForNavigationResponse:decisionHandler:方法返回的決定策略。typedef enum WKNavigationResponsePolicy : NSInteger { WKNavigationResponsePolicyCancel, WKNavigationResponsePolicyAllow } WKNavigationResponsePolicy;
WKUIDelegate API
WKUIDelegate 類是網(wǎng)頁視圖的用戶界面委托協(xié)議,提供了代表網(wǎng)頁呈現(xiàn)本機(jī)用戶界面元素的方法。
Web視圖用戶界面委托對象實(shí)現(xiàn)此協(xié)議來控制打開的新窗口,增加用戶單擊元素時顯示的默認(rèn)菜單項(xiàng)的行為,并執(zhí)行其他與用戶界面相關(guān)的任務(wù)。 可以通過處理 JavaScript 或其他插件內(nèi)容來調(diào)用這些方法。 默認(rèn)Web視圖實(shí)現(xiàn)假定每個Web視圖有一個窗口,因此非常規(guī)用戶界面可能會實(shí)現(xiàn)用戶界面委托。
參考:【iOS 開發(fā)】WKWebView 學(xué)習(xí)筆記 (3)-WKUIDelegate
Symbols
創(chuàng)建 web 視圖
-
- webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:
創(chuàng)建一個新的 web 視圖
顯示 UI 面板
-
- webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:
顯示一個 JavaScript 警告面板。 -
- webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:
顯示一個 JavaScript 確認(rèn)面板。 -
- webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:
顯示一個 JavaScript 文本輸入面板。
關(guān)閉web視圖
-
webViewDidClose:
通知應(yīng)用程序 DOM 窗口成功關(guān)閉。
顯示上傳面板
-
- webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:
顯示文件上傳面板。
響應(yīng)強(qiáng)制觸控動作
-
- webView:shouldPreviewElement:
確定給定元素是否應(yīng)顯示預(yù)覽。 -
- webView:previewingViewControllerForElement:defaultActions:
當(dāng)用戶執(zhí)行窺視操作時調(diào)用。 -
- webView:commitPreviewingViewController:
當(dāng)用戶在預(yù)覽中執(zhí)行彈出操作時調(diào)用。
OC 原生顯示 JS 彈窗的正確方法
參考: WKWebView completionHandler called before dismissal @stackoverflow
// 顯示一個 JavaScript 警告彈窗
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"AlertPanel" message:message preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// ??必須在這里回調(diào) JavaScript
completionHandler();
}];
[alertController addAction:alertAction];
[self presentViewController:alertController animated:YES completion:nil];
}
WKUIDelegate 示例代碼:
#pragma mark - WKUIDelegate
// 創(chuàng)建新的webView
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
WKFrameInfo *frameInfo = navigationAction.targetFrame;
if (![frameInfo isMainFrame]) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
// 顯示 JavaScript 警告框
// 測試JS代碼:alert("alert message!")
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
[UIAlertController showAlertInViewController:self withTitle:@"溫馨提示" message:message cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@[@"確認(rèn)"] tapBlock:^(UIAlertController * _Nonnull controller, UIAlertAction * _Nonnull action, NSInteger buttonIndex) {
completionHandler();
}];
}
// 確認(rèn)框
// 測試JS代碼:confirm("confirm message!")
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler {
[UIAlertController showAlertInViewController:self withTitle:@"需要再次確認(rèn)" message:message cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@[@"確認(rèn)"] tapBlock:^(UIAlertController * _Nonnull controller, UIAlertAction * _Nonnull action, NSInteger buttonIndex) {
if (buttonIndex == 0) {
completionHandler(NO);
}else {
completionHandler(YES);
}
}];
}
WKScriptMessageHandler API
遵守 WKScriptMessageHandler 協(xié)議的類,提供了從網(wǎng)頁中運(yùn)行 JavaScript 接收消息的方法。
// 從 web 界面中接收到一個腳本時調(diào)用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
這個協(xié)議只包含以上一個必須實(shí)現(xiàn)的方法,這個方法是提高App與web端交互的關(guān)鍵,它可以直接將接收到的JS腳本轉(zhuǎn)為 OC 或 Swift 對象。(當(dāng)然,在 UIWebView 也可以通過“曲線救國”的方式與web進(jìn)行交互,著名的Cordova 框架就是這種機(jī)制)
這個 API 真正神奇的地方在于 JavaScript 對象可以自動轉(zhuǎn)換為 Objective-C 或 Swift 對象。
在 JavaScript 端通過
window.webkit.messageHandlers.{InjectedName}.postMessage()方法來發(fā)送消息到native。我們需要遵守該協(xié)議,然后實(shí)現(xiàn)代理方法,就可以收到消息,并做相應(yīng)的的處理。如果在開始時就注入很多的名稱,就需要區(qū)分處理
if (message.name == "AppModel" ) { //... }——WKWebView特性及使用 @360doc 【Swift】
WKUserScript API
WKUserScript 對象表示可以注入到網(wǎng)頁中的腳本。
Symbols
初始化腳本
-
-initWithSource:injectionTime:forMainFrameOnly:
返回可以添加到用戶內(nèi)容控制器中的初始化用戶腳本。
檢查腳本信息
-
source
腳本源代碼 -
injectionTime
腳本應(yīng)該被注入網(wǎng)頁中的時間點(diǎn)。 -
forMainFrameOnly
布爾值,指示腳本是否僅應(yīng)注入主框架(是)或所有框架(否)。
常量
-
WKUserScriptInjectionTime
將用戶腳本注入網(wǎng)頁的時間。
typedef enum WKUserScriptInjectionTime : NSInteger {
WKUserScriptInjectionTimeAtDocumentStart, // 在文檔元素創(chuàng)建之后,但在加載任何其他內(nèi)容之前注入腳本。
WKUserScriptInjectionTimeAtDocumentEnd //在文件完成加載后,但在其他子資源完成加載之前注入該腳本。
} WKUserScriptInjectionTime;
WKUserScript 對象可以以 JavaScript 源碼形式初始化,初始化時還可以傳入時間是在加載之前還是結(jié)束時注入,以及腳本影響的是這個布局還是僅主要布局。于是用戶腳本被加入到 WKUserContentController 中,并且以 WKWebViewConfiguration 屬性傳入到 WKWebView 的初始化過程中。
- (void)viewDidLoad {
[super viewDidLoad];
// 使用 WKUserScript 注入JavaScript腳本
// 圖片縮放的js代碼
NSString *js = @"var count = document.images.length;for (var i = 0; i < count; i++) {var image = document.images[i];image.style.width=320;};window.alert('找到' + count + '張圖');";
// 根據(jù)JS字符串初始化 WKUserScript 對象
WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
// 根據(jù)生成的 WKUserScript 對象,初始化 WKWebViewConfiguration 對象
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addUserScript:script];
// 初始化 WKWebView 對象
_webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
_webView.UIDelegate = self;
_webView.navigationDelegate = self;
[_webView loadHTMLString:@"<head></head>" baseURL:nil];
[self.view addSubview:_webView];
}
使用示例:自適應(yīng)文本字體大小
場景:加載的 HTML 網(wǎng)頁沒有對移動端設(shè)備屏幕做適配,導(dǎo)致加載后顯示的字體太大或者太小,影響用戶體驗(yàn),通過注入 JavaScript 腳本的方式可以解決這個問題。
以下為代碼示例:
- (WKWebViewConfiguration *)webViewConfiguration {
if (!_webViewConfiguration) {
_webViewConfiguration = [[WKWebViewConfiguration alloc] init];
// 自適應(yīng)字體
NSString *javaScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:javaScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
WKUserContentController *contentController = [[WKUserContentController alloc] init];
[contentController addUserScript:userScript];
_webViewConfiguration.userContentController = contentController;
}
return _webViewConfiguration;
}