WKWebView 動態(tài)同步Cookie

項目需要對`WKWebView`進行Cookie同步,在網(wǎng)上找了好多方法绝淡,經(jīng)過測試:
第一種(無效):通過`evaluateJavaScript`注入叹谁,這種方法是注入不了Cookie的混坞,因為js沒有權(quán)限
第二種(無效):通過請求頭的方法超营,`[request setValue:@"cookie string" forHTTPHeaderField:@"Cookie"]`庆揩,這種方法js不能通過document.cookie獲取到cookie
第二種:通過`addUserScript`方法镊叁,如果你的WKWebView已經(jīng)登錄了唾琼,只需要在`WKWebView`的初始化的時候注入一次就好了,但是如果你的`WKWebView`是要在頁面上動態(tài)同步`Cookie`的話疯趟,還需要其它操作拘哨,下面是我的解決方案。

初始化WKWebView注入Cookie

- (instancetype)initWithFrame:(CGRect)frame configuration:(nonnull WKWebViewConfiguration *)configuration
{
    //一定要在[super initWithFrame:frame configuration:configuration]之前設(shè)置迅办,否則無效
    WKUserContentController *userContentController = WKUserContentController.new;
    WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource:[self updateCookies] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
    
    [userContentController addUserScript:cookieScript];
    configuration.userContentController = userContentController;
    
    self = [super initWithFrame:frame configuration:configuration];
    if (self) {
        self.scrollView.bounces = NO;
        self.scrollView.showsHorizontalScrollIndicator = NO;
        [self sizeToFit];
        self.backgroundColor = HSQColorGray250;
        self.allowsBackForwardNavigationGestures = YES;
        [self addSubview:self.progressView];
        [self addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:nil];
    }
    return self;
}

這里拼接是Cookie

- (NSString *)updateCookies
{
    NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
    NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    //這邊是在登錄接口保存了登錄Cookie
    NSString *loginCookie = [[NSUserDefaults standardUserDefaults] objectForKey:kDMUserLoginCookie];
    
    NSMutableString *mHsqCookie = [[NSMutableString alloc] init];
    NSMutableString *mDwdCookie = [[NSMutableString alloc] init];
    
    for (NSHTTPCookie *cookie in cookieJar.cookies) {
    //這邊是做域名攔截
        if ([cookie.domain containsString:@".xxxx.net"]) {
            NSString *hsqCookie = [NSString stringWithFormat:@"document.cookie='%@=%@;%@=%@';", cookie.name, cookie.value, @"domain", cookie.domain];
            //用來處理垮域問題
            NSString *dwdCookie = [NSString stringWithFormat:@"document.cookie='%@=%@;%@=%@';", cookie.name, cookie.value, @"domain", @"yyyy.net"];
            [mHsqCookie appendString:hsqCookie];
            [mDwdCookie appendString:dwdCookie];
        }
    }
    
    //拼接登錄Cookie
    if (!IsNilOrNull(loginCookie) && ![cookieValue containsString:HsqSidCookie]) {
        [mHsqCookie appendString:[NSString stringWithFormat:@"document.cookie='%@domain=.xxxx.net';", loginCookie]];
        [mDwdCookie appendString:[NSString stringWithFormat:@"document.cookie='%@domain=yyyy.net';", loginCookie]];
    }
    
    [cookieValue appendString:mHsqCookie];
    [cookieValue appendString:mDwdCookie];

    return cookieValue;
}

接口請求拿到登錄Cookie保存在本地

// 保存登錄cookie
- (void)saveLoginCookie:(NSURLSessionDataTask *)task
{
    if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
        NSDictionary *allFields = response.allHeaderFields;
        NSArray<NSHTTPCookie*> *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:allFields forURL:[NSURL URLWithString:[NSString stringWithFormat:@"api地址"]]];
        [cookies enumerateObjectsUsingBlock:^(NSHTTPCookie * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if ([obj.domain containsString:@".xxxx.net"] && [obj.name isEqualToString:HsqSidCookie] && ![obj.value isEqualToString:@"deleted"]) {
                NSString *hsqCookie = [NSString stringWithFormat:@"%@=%@;", obj.name, obj.value];
                [[NSUserDefaults standardUserDefaults] setObject:hsqCookie forKey:kDMUserLoginCookie];
                [[NSUserDefaults standardUserDefaults] synchronize];
                *stop = YES;
            }
        }];
    }
}

動態(tài)同步cookie

- (WKNavigation *)reload
{
    [self.configuration.userContentController removeAllUserScripts];
    
    WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource:[self updateCookies] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
    [self.configuration.userContentController addUserScript:cookieScript];
    
    return [super reload];
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宅静,一起剝皮案震驚了整個濱河市章蚣,隨后出現(xiàn)的幾起案子站欺,更是在濱河造成了極大的恐慌,老刑警劉巖纤垂,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矾策,死亡現(xiàn)場離奇詭異,居然都是意外死亡峭沦,警方通過查閱死者的電腦和手機贾虽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吼鱼,“玉大人蓬豁,你說我怎么就攤上這事绰咽。” “怎么了地粪?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵取募,是天一觀的道長。 經(jīng)常有香客問我蟆技,道長玩敏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任质礼,我火速辦了婚禮旺聚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眶蕉。我一直安慰自己砰粹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布造挽。 她就那樣靜靜地躺著伸眶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刽宪。 梳的紋絲不亂的頭發(fā)上厘贼,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音圣拄,去河邊找鬼嘴秸。 笑死,一個胖子當(dāng)著我的面吹牛庇谆,可吹牛的內(nèi)容都是我干的岳掐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼饭耳,長吁一口氣:“原來是場噩夢啊……” “哼串述!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寞肖,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤纲酗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后新蟆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體觅赊,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年琼稻,在試婚紗的時候發(fā)現(xiàn)自己被綠了吮螺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸠补,靈堂內(nèi)的尸體忽然破棺而出萝风,到底是詐尸還是另有隱情,我是刑警寧澤紫岩,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布闹丐,位于F島的核電站,受9級特大地震影響被因,放射性物質(zhì)發(fā)生泄漏卿拴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一梨与、第九天 我趴在偏房一處隱蔽的房頂上張望堕花。 院中可真熱鬧,春花似錦粥鞋、人聲如沸缘挽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壕曼。三九已至,卻和暖如春等浊,著一層夾襖步出監(jiān)牢的瞬間腮郊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工筹燕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轧飞,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓撒踪,卻偏偏與公主長得像过咬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子制妄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,097評論 1 32
  • 1掸绞、WKWebView 白屏問題WKWebView 自詡擁有更快的加載速度,更低的內(nèi)存占用耕捞,但實際上 WKWebV...
    iosRn閱讀 2,098評論 1 10
  • 轉(zhuǎn)載鏈接:騰訊Bugly 導(dǎo)語 WKWebView 是蘋果在 WWDC 2014 上推出的新一代 webView ...
    Jelly_沫閱讀 2,860評論 0 3
  • WKWebView 是蘋果在 WWDC 2014 上推出的新一代 webView 組件衔掸,用以替代 UIKit 中笨...
    Aiana閱讀 4,585評論 1 8
  • 導(dǎo)語 WKWebView 是蘋果在 WWDC 2014 上推出的新一代 webView 組件,用以替代 UIKit...
    Jecky丶閱讀 8,450評論 2 22