WKWebView持久存储Cookie
我在我的本地iPhone应用程序,允许login/注册的网站上使用WKWebView,并将会话信息存储在Cookie中。 我想弄清楚如何持久存储cookie信息,所以当应用程序重新启动时,用户仍然可以访问他们的Web会话。
我在应用程序中有2个WKWebViews,他们共享一个WKProcessPool。 我从一个共享进程池开始:
WKProcessPool *processPool = [[WKProcessPool alloc] init];
然后对于每个WKWebView:
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; theConfiguration.processPool = processPool; self.webView = [[WKWebView alloc] initWithFrame:frame configuration:theConfiguration];
当我使用第一个WKWebViewlogin时,稍后再传递给第二个WKWebView,这个会话被保留,所以cookies被成功共享。 但是,当我重新启动应用程序时,会创build一个新的进程池,会话信息被销毁。 有什么办法让会话信息通过应用程序重新启动持续?
这实际上是一个虽然一个,因为有一个错误 ,仍然没有解决的苹果(我认为)和B)取决于你想要什么cookies,我想。
我现在不能testing,但我可以给你一些指示:
- 从
NSHTTPCookieStorage.sharedHTTPCookieStorage()
获取Cookie。 这似乎是越野车,显然cookie不会立即保存NSHTTPCookieStorage
find它们。 人们build议通过重置进程池来触发保存,但我不知道这是否可靠工作。 虽然你可能想自己尝试一下。 - 进程池并不是真正保存cookie的东西(尽pipe它定义了它们是否正确地共享)。 该文件说,这是
WKWebsiteDataStore
,所以我会看看。 至less从这里使用fetchDataRecordsOfTypes:completionHandler:
可能(不知道如何设置它们,我假设你不能只存储在用户默认情况下的商店出于与进程池相同的原因)。 - 如果你设法得到你需要的cookie(或者说他们的值),但是不能恢复它们,我想是这样的,看看这里 (基本上它显示了如何简单地准备httprequest与他们已经相关的部分:
[request addValue:@"TeskCookieKey1=TeskCookieValue1;TeskCookieKey2=TeskCookieValue2;" forHTTPHeaderField:@"Cookie"]
)。 - 如果一切都失败了,请检查这个 。 我知道提供只是链接只有答案是不好的,但我不能复制所有,只是想补充它的完整性。
最后一件事情总的来说:我说你的成功也可能取决于cookie的types。 这是因为这个答案指出,由服务器设置的cookie不能通过NSHTTPCookieStorage
访问。 我不知道这是否与你有关(但我想是的,因为你可能正在寻找一个会议,即服务器设置的cookie,是否正确?),我不知道这是否意味着其他方法失败以及。
如果一切都失败了,你可能会考虑将用户凭据保存在某个地方(例如钥匙串),并在下一个应用程序启动时自动重新使用它们。 这可能不会恢复所有的会话数据,但考虑到用户退出可能实际上是可取的应用程序? 另外也可以使用注入的脚本来捕获和保存某些值,以便在后面使用,就像这里提到的那样(显然不是在开始时设置它们,但是可能在某个时候检索它们,当然,您需要知道该站点是如何工作的) 。
我希望至less可以指出你解决问题的一些新的方向。 这并不像应该那样微不足道,看起来(当然,会话cookies也是一种安全相关的事情,所以也许把它们从App中隐藏起来是Apple有意识的deviseselect)。
我晚了一点,但人们可能会觉得这很有用。 有一个解决方法,这有点恼人,但据我所知,这是唯一的解决scheme,可靠地工作,至less直到苹果修复其愚蠢的API …
我已经花了好几天的时间把caching的cookies从WKWebView
出来,毫无疑问,最终我发布了可以直接从服务器上获取cookie的方法。
我试图做的第一件事就是获取所有在WKWebView
中运行的JavaScript的cookie,然后将它们传递给WKUserContentController
,在那里我将它们存储到UserDefaults
。 这不工作,因为我的cookieshttponly
,显然你不能得到那些与JavaScript …
我已经结束了通过插入一个JavaScript调用到服务器端的页面(在我的情况下的Ruby on Rail)以cookies作为参数来修复它,例如
sendToDevice("key:value")
上面的js函数只是简单地将cookies传递给设备。 希望这会帮助别人保持理智
将信息存储在NSUserDefaults
。 同时如果会话信息非常关键,最好将它存储在KeyChain
。
WKWebView
符合NSCoding
,所以你可以使用NSCoder
解码/编码你的webView,并将其存储在其他地方,如NSUserDefaults
。
//return data to store somewhere NSData* data = [NSKeyedArchiver archivedDataWithRootObject:self.webView];/ self.webView = [NSKeyedUnarchiver unarchiveObjectWithData:data];