WKWebView 遇到的坑

来源:互联网 发布:mysql主从原理 编辑:程序博客网 时间:2024/06/03 04:16

wkwebView 设置Cookies

使用WKWebView configoration 设置cookie 有时候可能不成功。
使用如下方法设置cookie会偶现设置不了的问题。

NSString *cookie = [NSString stringWithFormat:@"document.cookie = 'session_id=%@'; document.cookie = 'CLIENT=App'; document.cookie = 'domain=test'", accessToken];    WKUserScript *cookieScript = [[WKUserScript alloc]                                  initWithSource:cookie                                  injectionTime:WKUserScriptInjectionTimeAtDocumentStart                                  forMainFrameOnly:NO];    [self.configuration.userContentController addUserScript:cookieScript];

最后改为设置request headFile的方法

NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:url];        [request addValue:[NSString stringWithFormat:@"session_id=%@", accessToken] forHTTPHeaderField:@"Cookie"];        [request addValue:[NSString stringWithFormat:@"domain=test"] forHTTPHeaderField:@"Cookie"];        [self loadRequest:request];

缓存问题

在第一次打开webView后,移动端为了使用的便捷,会在本地做一个缓存,服务器端也有类似的缓存。但有时服务器端更改信息或者web端更改界面信息。我们往往打开移动端的webView界面,仍然是原来的界面状态,这就是移动端的缓存机制造成的。
有两个方法处理这个文图:

通过完全清除WKWebView的本地缓存,然后重新请求解决

 //// Optional data    NSSet *websiteDataTypes = [NSSet setWithArray:@[                                                    WKWebsiteDataTypeDiskCache,//                                                    //WKWebsiteDataTypeOfflineWebApplicationCache,                                                    WKWebsiteDataTypeMemoryCache,//                                                    //WKWebsiteDataTypeLocalStorage,//                                                    //WKWebsiteDataTypeCookies,//                                                    //WKWebsiteDataTypeSessionStorage,//                                                    //WKWebsiteDataTypeIndexedDBDatabases,//                                                    //WKWebsiteDataTypeWebSQLDatabases                                                    ]];    //// All kinds of data//    NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];    //// Date from    NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];    //// Execute    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{        // Done    }];

通过在请求时忽略本地和远程的缓存强制刷新

NSURLRequestReloadIgnoringLocalAndRemoteCacheDataNSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:20];[self.webView loadRequest:request];

常见请求缓存类型

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy){    NSURLRequestUseProtocolCachePolicy = 0,    NSURLRequestReloadIgnoringLocalCacheData = 1,    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,    NSURLRequestReturnCacheDataElseLoad = 2,    NSURLRequestReturnCacheDataDontLoad = 3,    NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented};
原创粉丝点击