当试图在WKWebview中加载url时,获得会话过期错误,但在SFSafariViewController或iOS中的



我的iOS应用程序有一个图像缩略图列表,在每次点击缩略图时,我们调用API来获取经过认证的URL(eUnity Imageviewer URL), URL有15分钟的会话,之后它将过期。

我的问题是,当我试图在WKWebView中加载url时,第一次它在应用程序新安装时正常打开,但是一旦我们在WKWebView上打开该url,我们(杀死/终止/放入后台)应用程序,当我们回到应用程序时,它会为每个缩略图提供错误会话过期,但相同的url在SFSafariViewController或外部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文档中,您可以查看可能更适合您需要的删除缓存对象的替代方案。

祝你好运!

相关内容

  • 没有找到相关文章

最新更新