42- WKWebView(6) - 补充: 实践中的坑
2019-03-08 本文已影响10人
春田花花幼儿园
第一坑: WKProcessPool
看过腾讯Bugly的那篇 《WKWebView 那些坑》,我们知道WKProcessPool可以解决不同的WKWebView 之间共享 Cookie(session Cookie and persistent Cookie)数据, 具体的做法是创建一个单利,来持有WKProcessPool。
场景:在H5中点击一些链接,它是会在当前的webView基础上,重新创建一个webView来展示的,而不是在当前webView上展示。 具体创建方式就是回调在第二章中执行WKUIDelegate的代理方法。
解决这一个问题的方式,具体代码如下:
WKWebViewConfiguration * webConfiguration = [[WKWebViewConfiguration alloc]init];
webConfiguration.processPool = [LLWKProcessPoolUtil sharedInstance].wkProcessPool;
@interface LLWKProcessPoolUtil : NSObject
+ (LLWKProcessPoolUtil *)sharedInstance;
/// WKProcessPool
@property (nonatomic, strong) WKProcessPool *wkProcessPool;
/// 销毁wkProcessPool单例属性
- (void)destroyInstance;
@end
#import "LLWKProcessPoolUtil.h"
@implementation LLWKProcessPoolUtil
+ (LLWKProcessPoolUtil *)sharedInstance
{
static dispatch_once_t once;
static YCWKProcessPoolUtil * __singleton__;
dispatch_once( &once, ^{
__singleton__ = [[LLWKProcessPoolUtil alloc] init];
});
return __singleton__;
}
#pragma mark - 不同webView中的Cookie
static WKProcessPool *__singlePool__ = nil;
static dispatch_once_t onceTokenPool;
- (WKProcessPool *)wkProcessPool
{
dispatch_once( &onceTokenPool, ^{
__singlePool__ = [[WKProcessPool alloc] init];
});
return __singlePool__;
}
- (void)destroyInstance
{
onceTokenPool = 0;
__singlePool__ =nil;
}
@end
问题:这样虽然可以解决创新创建的WKWebView的cookie访问问题,但是因为是单利持有的,当我们切换用户登录之后,webView会出现带有上一个用户Cookie的问题,这对于设计到积分和金钱的业务就很麻烦了,H5以为是上一个用户登录的。 解决方法, 切换登录的时候,将单利持有的proceressPool销毁掉,代码如下:
[LLWKProcessPoolUtil destroyInstance];
但是这样,我们会有另外一个问题,发生在iOS8~iOS10,proceressPool销毁之后进入再次进入webView进行登录,按照我们第四章中的Cookie策略,Cookie死活没有了。 比如得重新重新走一遍创建WKWebView,然后请求url的步骤才能生效。 好吧,原因是这个时候,document.Cookie也随之丢失了,解决方法,你也想到了,重新给document.Cookie赋值。
交流
希望能和大家交流技术
Blog:http://www.lilongcnc.cc