WKWebView解決UIWebView內(nèi)存飆升問(wèn)題

1.開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)使用UIWebView加載HTML內(nèi)存飆升,加載速度較慢。改用WKWebView得已解決。
2.改用WKWebView后發(fā)現(xiàn)內(nèi)容顯示偏小,根本原因?yàn)椋篐TML5缺少meta標(biāo)簽,可以讓后臺(tái)添加完整的HTML5標(biāo)簽,也可以在客戶(hù)端添加代碼調(diào)整(代碼見(jiàn)文章尾部)

WKWebView iOS 8后才有的,使用時(shí)需要導(dǎo)入頭文件#import<Webkit/webKit.h>

WKWebView的屬性介紹:

WKBackForwardList:之前訪(fǎng)問(wèn)過(guò)的 web頁(yè)面的列表,可以通過(guò)后退和前進(jìn)動(dòng)作來(lái)訪(fǎng)問(wèn)到。

WKBackForwardListItem: webview中后退列表里的某一個(gè)網(wǎng)頁(yè)。

WKFrameInfo: 包含一個(gè)網(wǎng)頁(yè)的布局信息。

WKNavigation: 包含一個(gè)網(wǎng)頁(yè)的加載進(jìn)度信息。

WKNavigationAction:包含可能讓網(wǎng)頁(yè)導(dǎo)航變化的信息,用于判斷是否做出導(dǎo)航變化。

WKNavigationResponse:包含可能讓網(wǎng)頁(yè)導(dǎo)航變化的返回內(nèi)容信息,用于判斷是否做出導(dǎo)航變化。

WKPreferences: 概括一個(gè) webview 的偏好設(shè)置。

WKProcessPool: 表示一個(gè) web 內(nèi)容加載池。

WKUserContentController: 提供使用 JavaScript post 信息和注射 script 的方法。

WKScriptMessage: 包含網(wǎng)頁(yè)發(fā)出的信息。

WKUserScript:表示可以被網(wǎng)頁(yè)接受的用戶(hù)腳本。

WKWebViewConfiguration: 初始化 webview 的設(shè)置。

WKWindowFeatures: 指定加載新網(wǎng)頁(yè)時(shí)的窗口屬性。

WKNavigationDelegate: 提供了追蹤主窗口網(wǎng)頁(yè)加載過(guò)程和判斷主窗口和子窗口是否進(jìn)行頁(yè)面加載新頁(yè)面的相關(guān)方法。

WKScriptMessageHandler: 提供從網(wǎng)頁(yè)中收消息的回調(diào)方法。

WKUIDelegate: 提供用原生控件顯示網(wǎng)頁(yè)的方法回調(diào)。

WKWebView代理:

1.WKNavigationDelegate 該代理提供的方法,可以用來(lái)追蹤加載過(guò)程(頁(yè)面開(kāi)始加載、加載完成、加載失?。Q定是否執(zhí)行跳轉(zhuǎn)。

// 頁(yè)面開(kāi)始加載時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{

}

// 當(dāng)內(nèi)容開(kāi)始返回時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{

}

// 頁(yè)面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
}

// 頁(yè)面加載失敗時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation{
}

頁(yè)面跳轉(zhuǎn)的代理方法有三種,分為(收到跳轉(zhuǎn)與決定是否跳轉(zhuǎn)兩種)

// 接收到服務(wù)器跳轉(zhuǎn)請(qǐng)求之后調(diào)用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation{
     
}
// 在收到響應(yīng)后,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
     
    NSLog(@"%@",navigationResponse.response.URL.absoluteString);
    //允許跳轉(zhuǎn)
    decisionHandler(WKNavigationResponsePolicyAllow);
    //不允許跳轉(zhuǎn)
    //decisionHandler(WKNavigationResponsePolicyCancel);
}
// 在發(fā)送請(qǐng)求之前,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
     
    NSLog(@"%@",navigationAction.request.URL.absoluteString);
    //允許跳轉(zhuǎn)
    decisionHandler(WKNavigationActionPolicyAllow);
    //不允許跳轉(zhuǎn)
    //decisionHandler(WKNavigationActionPolicyCancel);
}

2.WKUIDelegate 該代理提供的方法主要處理JS腳本,確認(rèn)框,警告框等

// 創(chuàng)建一個(gè)新的WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{
    return [[WKWebView alloc]init];
}
// 輸入框
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler{
    completionHandler(@"http");
}
// 確認(rèn)框
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler{
    completionHandler(YES);
}
// 警告框
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
    NSLog(@"%@",message);
    completionHandler();
}

客戶(hù)端添加meta標(biāo)簽:

NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
        
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
WKUserContentController *wkUController = [[WKUserContentController alloc] init];
[wkUController addUserScript:wkUScript];
        
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = wkUController;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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