WKWebView/UIWebView速度优化及清空访问栈

前言

接到一个提升App里h5的加载速度优化的问题,参考了很多文章后决定从webview缓存池、并行加载开始

1、统计从的耗时

点击入口->controller创建(init)->设置访问的url地址->调用webview的loadRequest->webview回调start->webview回调finish

统计发现,在调用点击入口到loadRequest这个过程耗费了0.5s左右,
1、于是参考VasSonic在Controller初始化Init时就调用初始好Webview,后来改成在APP启动时就创建一个Webview的缓存池,这样在页面一开始时就已经有webkit内核初始化好的Webview
2、在设置好url后立马调用Webview的loadRequest

但是这个过程中遇到了几个问题,在使用Webview缓存池使用Webview时会有Webview留存上次访问栈的问题,同时在下次请求时还会先展示上次请求过的内容,具体解决办法如下:

清空Webview的缓存栈:执行js方法

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

删除上次访问的内容

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

清空sessionStorage里的内容

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

清空locationStorage里的内容

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

清空cookie里的内容

[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里的内容
- (void)test_clearBody;
/// 替换url请求,清空访问栈
- (void)test_replaceUrl:(NSString *)url;
/// 清除LocalStorage里的内容
- (void)test_deleLocalStorage:(NSString *)key;
/// 清除SessionStorage里的内容
- (void)test_deleSessionStorage:(NSString *)key;
/// 清除cookie里的内容
- (void)test_deleCookie:(NSString *)key path:(NSString *)path;
@end
NS_ASSUME_NONNULL_END

WKWebView+Test.m

#import "WKWebView+Test.h"

@implementation WKWebView (Test)
// 删除webview里的内容
- (void)test_clearBody{
   [self evaluateJavaScript@"window.document.body.remove();"]
}
/// 替换url请求,清空访问栈
- (void)test_replaceUrl:(NSString *)url {

    if ([url.lowercaseString hasPrefix:@"http"]) {
        NSString *href = [NSString stringWithFormat:@"window.location.replace('%@')",url];
        [self evaluateJavaScript:href completionHandler:nil];
    }
}
/// 清除LocalStorage里的内容
- (void)test_deleLocalStorage:(NSString *)key {
    NSString *text = [NSString stringWithFormat:@"window.localStorage.removeItem(\"%@\",\"\");",key];
    [self evaluateJavaScript:text completionHandler:nil];
}
/// 清除SessionStorage里的内容
- (void)test_deleSessionStorage:(NSString *)key {
    NSString *text = [NSString stringWithFormat:@"window.sessionStorage.removeItem(\"%@\",\"\");",key];
    [self evaluateJavaScript:text completionHandler:nil];
}
/// 清除cookie里的内容
- (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

针对WKWebview请求网络时cookie丢失的问题,对重定向的请求都重新将cookie读取出来放入到请求的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;
}

延伸阅读:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 10,696评论 1 23
  • 37.cocoa内存管理规则 1)当你使用new,alloc或copy方法创建一个对象时,该对象的保留计数器值为1...
    如风家的秘密阅读 4,390评论 0 4
  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 5,310评论 1 27
  • 看那一棵棵挺拔的白杨树。站在荒无人烟的沙漠中。默默守卫我们的祖国。多像那一个个的士兵。看他虽生长在荒凉的戈...
    稳稳的幸福_573f阅读 4,001评论 0 0
  • 女人 烟 狗 文/李聪 她抽着烟又扔掉烟头, 狗仍然走在前面; 你以为她在暗沉的街道自甘堕落, 你以为她的肺已被孤...
    招招2021阅读 1,769评论 2 5

友情链接更多精彩内容