WKWebView/UIWebView速度優(yōu)化及清空訪問(wèn)棧

前言

接到一個(gè)提升App里h5的加載速度優(yōu)化的問(wèn)題,參考了很多文章后決定從webview緩存池、并行加載開(kāi)始

1、統(tǒng)計(jì)從的耗時(shí)

點(diǎn)擊入口->controller創(chuàng)建(init)->設(shè)置訪問(wèn)的url地址->調(diào)用webview的loadRequest->webview回調(diào)start->webview回調(diào)finish

統(tǒng)計(jì)發(fā)現(xiàn),在調(diào)用點(diǎn)擊入口到loadRequest這個(gè)過(guò)程耗費(fèi)了0.5s左右,
1、于是參考VasSonic在Controller初始化Init時(shí)就調(diào)用初始好Webview,后來(lái)改成在APP啟動(dòng)時(shí)就創(chuàng)建一個(gè)Webview的緩存池,這樣在頁(yè)面一開(kāi)始時(shí)就已經(jīng)有webkit內(nèi)核初始化好的Webview
2、在設(shè)置好url后立馬調(diào)用Webview的loadRequest

但是這個(gè)過(guò)程中遇到了幾個(gè)問(wèn)題,在使用Webview緩存池使用Webview時(shí)會(huì)有Webview留存上次訪問(wèn)棧的問(wèn)題,同時(shí)在下次請(qǐng)求時(shí)還會(huì)先展示上次請(qǐng)求過(guò)的內(nèi)容,具體解決辦法如下:

清空Webview的緩存棧:執(zhí)行js方法

[webView evaluateJavaScript@" window.location.replace( 'https://www.baidu.com' )"]

刪除上次訪問(wèn)的內(nèi)容

[webView evaluateJavaScript@"window.document.body.remove();"]

清空sessionStorage里的內(nèi)容

[webView evaluateJavaScript@"window.sessionStorage.removeItem(\"token\");"]

清空l(shuí)ocationStorage里的內(nèi)容

[webView evaluateJavaScript@"window.localStorage.removeItem(\"token\");"]

清空cookie里的內(nèi)容

[webView evaluateJavaScript:@"document.cookie = \"token=xxx;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/;\""]

完整處理分類:
WKWebView+Test.h

#import <WebKit/WebKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface WKWebView (Test)
// 刪除webview里的內(nèi)容
- (void)test_clearBody;
/// 替換url請(qǐng)求,清空訪問(wèn)棧
- (void)test_replaceUrl:(NSString *)url;
/// 清除LocalStorage里的內(nèi)容
- (void)test_deleLocalStorage:(NSString *)key;
/// 清除SessionStorage里的內(nèi)容
- (void)test_deleSessionStorage:(NSString *)key;
/// 清除cookie里的內(nèi)容
- (void)test_deleCookie:(NSString *)key path:(NSString *)path;
@end
NS_ASSUME_NONNULL_END

WKWebView+Test.m

#import "WKWebView+Test.h"

@implementation WKWebView (Test)
// 刪除webview里的內(nèi)容
- (void)test_clearBody{
   [self evaluateJavaScript@"window.document.body.remove();"]
}
/// 替換url請(qǐng)求,清空訪問(wèn)棧
- (void)test_replaceUrl:(NSString *)url {

    if ([url.lowercaseString hasPrefix:@"http"]) {
        NSString *href = [NSString stringWithFormat:@"window.location.replace('%@')",url];
        [self evaluateJavaScript:href completionHandler:nil];
    }
}
/// 清除LocalStorage里的內(nèi)容
- (void)test_deleLocalStorage:(NSString *)key {
    NSString *text = [NSString stringWithFormat:@"window.localStorage.removeItem(\"%@\",\"\");",key];
    [self evaluateJavaScript:text completionHandler:nil];
}
/// 清除SessionStorage里的內(nèi)容
- (void)test_deleSessionStorage:(NSString *)key {
    NSString *text = [NSString stringWithFormat:@"window.sessionStorage.removeItem(\"%@\",\"\");",key];
    [self evaluateJavaScript:text completionHandler:nil];
}
/// 清除cookie里的內(nèi)容
- (void)test_deleCookie:(NSString *)key path:(NSString *)path {
    NSString *text = [NSString stringWithFormat:@"document.cookie = \"%@=empty;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=%@;\"",key,path];
    [self evaluateJavaScript:text completionHandler:nil];
}
@end

針對(duì)WKWebview請(qǐng)求網(wǎng)絡(luò)時(shí)cookie丟失的問(wèn)題,對(duì)重定向的請(qǐng)求都重新將cookie讀取出來(lái)放入到請(qǐng)求的header的cookie里

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    [self redirectRequest: navigationAction.request];
    decisionHandler(WKNavigationActionPolicyAllow);
}

- (NSURLRequest *)redirectRequest:(NSURLRequest *)request
{
    NSMutableURLRequest *redirectRequest;
    if ([request isKindOfClass:[NSMutableURLRequest class]]) {
        redirectRequest = (NSMutableURLRequest *)request;
    } else {
        redirectRequest = [request mutableCopy];
    }
NSArray<NSHTTPCookie *> *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies;
    NSDictionary *cookieHeaders = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
    if (originCookies.count) {
        NSMutableDictionary *redirectHeaders = request.allHTTPHeaderFields.mutableCopy;
        [redirectHeaders setValuesForKeysWithDictionary:cookieHeaders];
        redirectRequest.allHTTPHeaderFields = redirectHeaders;
    }
    return redirectRequest;
}

延伸閱讀:

最后編輯于
?著作權(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)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒(méi)有APIManager這一層是沒(méi)法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,466評(píng)論 1 23
  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new,alloc或copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的保留計(jì)數(shù)器值為1...
    如風(fēng)家的秘密閱讀 954評(píng)論 0 4
  • 一、深復(fù)制和淺復(fù)制的區(qū)別? 1、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔?,即兩個(gè)指針指向同一塊內(nèi)存單元!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,527評(píng)論 1 27
  • 看那一棵棵挺拔的白楊樹。站在荒無(wú)人煙的沙漠中。默默守衛(wèi)我們的祖國(guó)。多像那一個(gè)個(gè)的士兵??此m生長(zhǎng)在荒涼的戈...
    穩(wěn)穩(wěn)的幸福_573f閱讀 757評(píng)論 0 0
  • 女人 煙 狗 文/李聰 她抽著煙又扔掉煙頭, 狗仍然走在前面; 你以為她在暗沉的街道自甘墮落, 你以為她的肺已被孤...
    招招2021閱讀 284評(píng)論 2 5

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