尝试在 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 在SFSafariViewController 或外部 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 中工作正常时出现会话过期错误的主要内容,如果未能解决你的问题,请参考以下文章

CSS 未在 WKWebView 中加载

在 WKWebView 中加载 safari 或 chrome 中的链接/URL

iOS:如何在 webview 或 wkwebview 中加载动画 webp 图像

如何通过 WKWebVIew 或 JSC 在 iOS 应用程序中加载 WebAssembly

在 WKWebView 中加载 Microsoft Office 文档

下载 WKWebView 中加载的嵌入式 PDF