iOS接下来要研究的知识点WebView 各种相关

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


上一篇下一篇

猜你喜欢

热点阅读