2

我正在替换UIWebView我们的应用程序,WKWebView但遇到了 cookie 问题。我们的应用程序中有一个登录过程,其中 Web 表单显示在 Web 视图中,如果登录成功,我们将调用一个服务来为我们提供身份验证令牌。该服务通过在 Web 视图中设置的会话 cookie 识别成功登录。UIWebView我们不需要做任何事情来将此 cookie 传递给令牌请求,因为两者UIWebView都使用NSURLSessionshared 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. BDJSESSIONIDcookie 是这里重要的一个。如果我错过了,对令牌服务的调用将创建一个用户未登录的新会话。

我现在的问题是,当我像这样调用令牌服务时,一些 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.

4

1 回答 1

0

HTTPCookieStorage文档提到以下几点:

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

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

[[[[webView configuration] websiteDataStore] httpCookieStore] setCookie:cookie completionHandler:^{
    NSLog(@"Added cookie: %@", cookie);
}];
于 2020-06-04T13:50:21.453 回答