一、Cookie适配
1.现状
WKWebView适配中最麻烦的就是cookie同步问题
WKWebView采用了独立存储控件,因此和以往的UIWebView并不互通
虽然iOS11以后,iOS开放了WKHTTPCookieStore让开发者去同步,但是还是需要考虑低版本的 同步问题,本章节从各个角度切入考虑cookie同步问题
2.同步cookie(NSHTTPCookieStorage->WKHTTPCookieStore)
iOS11+
可以直接使用WKHTTPCookieStore遍历方式设值,可以在创建wkwebview时候就同步也可以是请求时候
// iOS11同步 HTTPCookieStorag到WKHTTPCookieStore WKHTTPCookieStore *cookieStore = self.wkWebView.configuration.websiteDataStore.httpCookieStore; - (void)syncCookiesToWKCookieStore:(WKHTTPCookieStore *)cookieStore API_AVAILABLE(ios(11.0)){ NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]; if (cookies.count == 0) return; for (NSHTTPCookie *cookie in cookies) { [cookieStore setCookie:cookie completionHandler:^{ if ([cookies.lastObject isEqual:cookie]) { [self wkwebviewSetCookieSuccess]; } }]; } }
同步cookie可以在初始化wkwebview的时候,也可以在请求的时候。初始化时候同步可以确保发起html页面请求的时候带上cookie
例如:请求在线页面时候要通过cookie来认证身份,如果不是初始化时同步,可能请求页面时就是401了
iOS11-
通过前端执行js注入cookie,在请求时候执行
//wkwebview执行JS - (void)injectCookiesLT11 { WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource:[self cookieString] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO]; [self.wkWebView.configuration.userContentController addUserScript:cookieScript]; } //遍历NSHTTPCookieStorage,拼装JS并执行 - (NSString *)cookieString { NSMutableString *script = [NSMutableString string]; [script appendString:@"var cookieNames = document.cookie.split('; ').map(function(cookie) { return cookie.split('=')[0] } );\n"]; for (NSHTTPCookie *cookie in NSHTTPCookieStorage.sharedHTTPCookieStorage.cookies) { // Skip cookies that will break our script if ([cookie.value rangeOfString:@"'"].location != NSNotFound) { continue; } [script appendFormat:@"if (cookieNames.indexOf('%@') == -1) { document.cookie='%@'; };\n", cookie.name, [self formatCookie:cookie]]; } return script; } //Format cookie的js方法 - (NSString *)formatCookie:(NSHTTPCookie *)cookie { NSString *string = [NSString stringWithFo