【问题标题】:Missing some cookies on NSURLRequest after changing to WKWebView更改为 WKWebView 后在 NSURLRequest 上缺少一些 cookie
【发布时间】:2020-05-23 07:04:24
【问题描述】:

我正在将我们应用程序中的UIWebView 替换为WKWebView,并且遇到了cookie 问题。我们的应用程序中有一个登录过程,其中 Web 表单显示在 Web 视图中,如果登录成功,我们将调用一个服务来为我们提供身份验证令牌。该服务通过在 Web 视图中设置的会话 cookie 识别成功登录。使用UIWebView,我们不需要做任何事情来将此cookie 传递给令牌请求,因为UIWebViewNSURLSession 都使用共享的NSHTTPCookieStorageWKWebView 但是不使用共享的 cookie 存储,所以我在调用令牌服务之前将所有 cookie 从它复制到共享存储:

[webView.configuration.websiteDataStore.httpCookieStore getAllCookies:^(NSArray* cookies) {
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
    }
}];

如果我打印出共享存储中的 cookie,这似乎可以工作

for (NSHTTPCookie *cookie in [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies) {
    NSLog(@"name: %@\tvalue: %@", cookie.name, cookie.value);
}

我明白了:

name: mobile                                            value: 220|220
name: BDJSESSIONID                                      value: 0000YHfKy0d8aGHsOKPZBFznsQt:bdaix570
name: vp                                                value: ourdomain-com
name: ukontrol                                          value: nb8sfm1:1590215000215:
name: ACENBP                                            value: ffffffffc3a01a5945525d5f4f58455e445a4a423660
name: clientsession                                     value: NaN
name: _ga                                               value: GA1.2.2108673536.1590134296
name: _gid                                              value: GA1.2.570415333.1590134296
name: xLocale                                           value: da:DK
name: _gat_UA-56861410-1                                value: 1
name: PD_STATEFUL_c57e342c-fccf-4a0c-bb38-de5e09832f2c  value: %2Fcardapp.services
name: PD_STATEFUL_00819ac9-1bb8-4375-80ff-00c0285bab51  value: %2Fcardapp.services

这看起来与我使用UIWebView 时完全相同。 BDJSESSIONID cookie 是这里重要的一个。如果我错过了,对令牌服务的调用将创建一个用户未登录的新会话。

我现在的问题是,当我像这样调用令牌服务时,一些 cookie(包括 BDJSESSIONID)丢失了:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
NSURLSessionTask *sessionTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    ...
}];
[sessionTask resume];

这些是实际发送的 cookie:

我应该注意到,调用令牌服务的代码与我们使用UIWebView时相比没有改变。

【问题讨论】:

    标签: ios wkwebview nsurlsession nsurlrequest nshttpcookie


    【解决方案1】:

    HTTPCookieStoragedocumenttion 提到以下几点:

    • UIWebView - 应用内的 UIWebView 实例继承父应用的共享 cookie 存储。
    • WKWebView - 每个 WKWebView 实例都有自己的 cookie 存储。有关详细信息,请参阅 WKHTTPCookieStore 课程。

    因此,您添加到共享 NSHTTPCookieStorage 的 cookie 将不会直接在您的 WKWebView 中可用。 相反,您应该在 WKWebViewWKHTTPCookieStore 中设置 cookie:

    [[[[webView configuration] websiteDataStore] httpCookieStore] setCookie:cookie completionHandler:^{
        NSLog(@"Added cookie: %@", cookie);
    }];
    

    【讨论】:

    • 我意识到这一切,正如我在问题中所描述的那样。另外,我的问题反过来了——我需要将 cookie 从WKWebView 复制到共享存储,以便它们可以用于NSURLSession
    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多