我的iOS应用程序有一个图像缩略图列表,在每次点击缩略图时,我们调用API来获取经过认证的URL(eUnity Imageviewer URL), URL有15分钟的会话,之后它将过期。
我的问题是,当我试图在WKWebView
中加载url时,第一次它在应用程序新安装时正常打开,但是一旦我们在WKWebView
上打开该url,我们(杀死/终止/放入后台)应用程序,当我们回到应用程序时,它会为每个缩略图提供错误会话过期,但相同的url在SFSafariViewControlle
r或外部safari中工作正常。WKWebView
储存了什么吗??
我检查后清除[WKWebsiteDataStore allWebsiteDataTypes]
,NSCachedURLResponse
和允许任意负载也是YES
。
最后经过一些研究,我发现默认情况下WKWebView将cookie和会话存储到磁盘上,因此首先将WKWebsiteDataStore
类型设置为nonPersistentDataStore
,因为设置此属性将不允许在磁盘上存储数据
WKWebViewConfiguration *webConfiguration = [[WKWebViewConfiguration alloc] init];
webConfiguration.websiteDataStore = WKWebsiteDataStore.nonPersistentDataStore;
webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webConfiguration];
然后查找并删除[webView loadRequest:request]
方法之前存储的cookie,代码如下
if (@available(iOS 9.0, *)) {
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *cookiesFolderPath = [libraryPath stringByAppendingString:@"/Cookies"];
NSError *errors;
[[NSFileManager defaultManager] removeItemAtPath:cookiesFolderPath error:&errors];
} else {
WKWebsiteDataStore *dateStore = [WKWebsiteDataStore defaultDataStore];
[dateStore fetchDataRecordsOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] completionHandler:^(NSArray<WKWebsiteDataRecord *> * __nonnull records) {
for (WKWebsiteDataRecord *record in records) {
NSLog(@"All records - %@ and data type - %@", record, record.dataTypes);
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:record.dataTypes forDataRecords:@[record] completionHandler:^{
NSLog(@"Cookies for %@ deleted successfully",record.displayName);
}];
}
}];
}
以上方法对我很有效。
你绝对需要WKWebView缓存吗?
坦率地说,在大多数情况下,我们在使用缓存时遇到了问题,因为必须刷新的数据无论如何都是持久化的,这会导致各种错误。因此,我们决定忽略所有缓存数据,这解决了我们遇到的缓存错误。
初始化NSURLRequest
时,尽量将NSURLRequestReloadIgnoringCacheData
作为cachePolicy
参数。
或者你可以尝试执行下面的代码,但要注意,它会从应用程序中的所有NSURLRequests
中删除缓存的响应。
[[NSURLCache sharedURLCache] removeAllCachedResponses];
在NSURLCache
文档中,您可以查看可能更适合您需要的删除缓存对象的替代方案。
祝你好运!