WKWebView API

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)容,不要使用 UIWebViewWebView。

使用 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è)置使用 goBackgoForward方法的動作。當(dāng)用戶不能在某個方向上再移動時,使用canGoBackcanGoForward屬性禁用按鈕。

默認(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ī)制)

——WKWebView的新特性與使用 @saitjr

這個 API 真正神奇的地方在于 JavaScript 對象可以自動轉(zhuǎn)換為 Objective-C 或 Swift 對象。

——WKWebView @nshipster

在 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>![](http://upload-images.jianshu.io/upload_images/2648731-54ae5490e32407cf.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)" 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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容