美文网首页
iOS WKWebView cookie同步问题

iOS WKWebView cookie同步问题

作者: 陈不同 | 来源:发表于2020-06-14 14:10 被阅读0次

    WKWebView cookie同步问题:

    利用runtime  在loadRequest时,先同步一下cookie就可以了!

    以下是代码:

    .h

    #import

    NS_ASSUME_NONNULL_BEGIN

    @interface WKWebView (SafeUrl)

    + (void)changeMethodOriginalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector;

    - (NSURL *)xxx_URL;

    - (nullable WKNavigation *)xxx_loadRequest:(NSURLRequest *)request;

    @end

    NS_ASSUME_NONNULL_END

    .m

    #import "WKWebView+SafeUrl.h"

    @implementation WKWebView (SafeUrl)

    +(void)load{

        NSString*className=NSStringFromClass(self.class);

        NSLog(@"classname%@",className);

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken,^{

            SELoriginalSelector=@selector(URL);

            SELswizzledSelector=@selector(xxx_URL);

            [self changeMethodOriginalSelector:originalSelector swizzledSelector:swizzledSelector];

            SELoriginalSelector1=@selector(loadRequest:);

            SELswizzledSelector1=@selector(xxx_loadRequest:);

            [selfchangeMethodOriginalSelector:originalSelector1swizzledSelector:swizzledSelector1];

        });

    }

    + (void)changeMethodOriginalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector{

        Classclass= [selfclass];

        MethodoriginalMethod=class_getInstanceMethod(class,originalSelector);

        MethodswizzledMethod=class_getInstanceMethod(class,swizzledSelector);

        BOOLdidAddMethod=

        class_addMethod(class,

                        originalSelector,

                        method_getImplementation(swizzledMethod),

                        method_getTypeEncoding(swizzledMethod));

        if(didAddMethod){

            class_replaceMethod(class,

                                swizzledSelector,

                                method_getImplementation(originalMethod),

                                method_getTypeEncoding(originalMethod));

        }else{

            method_exchangeImplementations(originalMethod,swizzledMethod);

        }

    }

    - (NSURL *)xxx_URL{

        NSThread *thread = [NSThread currentThread];

        if(thread.isMainThread) {

            return [self xxx_URL];

        }else{

            dispatch_semaphore_t signal = dispatch_semaphore_create(1);

            __blockNSURL*URL;

            dispatch_async(dispatch_get_main_queue(), ^{

                URL = [selfxxx_URL];

                dispatch_semaphore_signal(signal);

            });

            dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);

            returnURL;

        }

    }

    - (nullable WKNavigation *)xxx_loadRequest:(NSURLRequest *)request{

        NSMutableURLRequest *muRequest = nil;

        if ([request isKindOfClass:[NSMutableURLRequest class]]) {

            muRequest = (NSMutableURLRequest*)request;

        }else{

            muRequest = [requestmutableCopy];

        }

        NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];

        NSDictionary *dict = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];

        muRequest.allHTTPHeaderFields= dict;

        return [self xxx_loadRequest:muRequest];

    }

    相关文章

      网友评论

          本文标题:iOS WKWebView cookie同步问题

          本文链接:https://www.haomeiwen.com/subject/royxxktx.html