尝试在 WKWebview 中加载 url 但在 SFSafariViewController 或 iOS 中的外部 safari 中工作正常时出现会话过期错误
Posted
技术标签:
【中文标题】尝试在 WKWebview 中加载 url 但在 SFSafariViewController 或 iOS 中的外部 safari 中工作正常时出现会话过期错误【英文标题】:Getting session expired error when trying to load url in WKWebview but working fine in SFSafariViewController or external safari in iOS 【发布时间】:2021-02-19 05:56:42 【问题描述】:我的 ios 应用程序有一个图像缩略图列表,每次点击缩略图时,我们都会调用 API 来获取经过身份验证的 URL(eUnity Imageviewer URL),并且 url 在 15 分钟后会过期。
我的问题是,当我尝试在 WKWebView
中加载 url 时,它第一次在新安装应用程序时正确打开,但是一旦我们在 WKWebView
上打开该 URL 并且我们(杀死/终止/放入后台) 应用程序,当我们返回应用程序时,它会为每个缩略图提供错误会话已过期,但相同的 url 在SFSafariViewControlle
r 或外部 safari 中工作正常。 WKWebView
是在存储什么吗??
我在清除[WKWebsiteDataStore allWebsiteDataTypes]
、NSCachedURLResponse
和 Allow Arbitrary Loads 后检查了也是YES
。
【问题讨论】:
【参考方案1】:最后经过一些研究,我发现默认情况下 WKWebView 将 cookie 和会话存储到磁盘上,所以首先将 WKWebsiteDataStore
类型设置为 nonPersistentDataStore
,因为通过设置此属性将不允许将数据存储在磁盘上
WKWebViewConfiguration *webConfiguration = [[WKWebViewConfiguration alloc] init];
webConfiguration.websiteDataStore = WKWebsiteDataStore.nonPersistentDataStore;
webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webConfiguration];
然后用下面的代码找到并删除[webView loadRequest:request]
方法之前存储的cookies
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);
];
];
上述解决方案对我有用。
【讨论】:
【参考方案2】:你绝对需要 WKWebView 缓存吗?
坦率地说,在大多数情况下,我们在使用缓存时遇到了问题,因为必须刷新的数据无论如何都会被持久化,从而导致各种错误。因此我们决定将所有缓存数据一起忽略,这样就解决了我们遇到的缓存问题。
初始化NSURLRequest
时,尝试将NSURLRequestReloadIgnoringCacheData
作为cachePolicy
参数传递。
您也可以尝试执行下面的代码,但请注意,它会从应用内的所有NSURLRequests
中删除缓存的响应。
[[NSURLCache sharedURLCache] removeAllCachedResponses];
在NSURLCache
documentation 中,您可以查看删除缓存对象的替代方法,这些方法可能更适合您的需求。
祝你好运!
【讨论】:
手动我们不会在 WKWebview 中缓存任何内容,我已经打印了日志以查看缓存、Cookie 和任何会话数据(如果可用),但没有任何内容。我也尝试了您的建议,但没有运气....谢谢以上是关于尝试在 WKWebview 中加载 url 但在 SFSafariViewController 或 iOS 中的外部 safari 中工作正常时出现会话过期错误的主要内容,如果未能解决你的问题,请参考以下文章
在 WKWebView 中加载 safari 或 chrome 中的链接/URL
iOS:如何在 webview 或 wkwebview 中加载动画 webp 图像
如何通过 WKWebVIew 或 JSC 在 iOS 应用程序中加载 WebAssembly