Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 更改为WKWebView后,NSURLRequest上缺少一些cookie_Ios_Wkwebview_Nsurlsession_Nsurlrequest_Nshttpcookie - Fatal编程技术网

Ios 更改为WKWebView后,NSURLRequest上缺少一些cookie

Ios 更改为WKWebView后,NSURLRequest上缺少一些cookie,ios,wkwebview,nsurlsession,nsurlrequest,nshttpcookie,Ios,Wkwebview,Nsurlsession,Nsurlrequest,Nshttpcookie,我正在用WKWebView替换应用程序中的UIWebView,我遇到了cookie问题。我们的应用程序中有一个登录过程,其中web表单显示在web视图中,如果登录成功,我们将调用一个提供身份验证令牌的服务。该服务通过在web视图中设置的会话cookie识别成功登录。使用UIWebView我们不需要做任何事情来将此cookie传递给令牌请求,因为UIWebView和nsursession都使用共享的NSHTTPCookieStorageWKWebView但是不使用共享cooke存储,因此在调用令牌

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

[webView.configuration.websiteDataStore.httpCookieStore getAllCookies:^(NSArray* cookies) {
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
    }
}];
如果我打印出共享存储中的cookies,这似乎是可行的

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];
这些是实际发送的cookies:

我应该注意到,调用令牌服务的代码与我们使用
UIWebView

时没有更改。文档提到了以下几点:

  • UIWebView-应用程序内的UIWebView实例继承父应用程序的共享cookie存储
  • -每个WKWebView实例都有自己的cookie存储。有关更多信息,请参见课程
因此,您添加到共享
NSHTTPCookieStorage
的cookie将无法直接在您的WKWebView中使用。 相反,您应该在您的中设置cookies:

文件中提到以下几点:

  • UIWebView-应用程序内的UIWebView实例继承父应用程序的共享cookie存储
  • -每个WKWebView实例都有自己的cookie存储。有关更多信息,请参见课程
因此,您添加到共享
NSHTTPCookieStorage
的cookie将无法直接在您的WKWebView中使用。 相反,您应该在您的中设置cookies:


正如我在问题中所描述的,我意识到了这一切。另外,我的问题正好相反-我需要将cookies从
WKWebView
复制到共享存储,以便它们可以用于
nsursession
。正如我在问题中所述,我意识到了这一切。另外,我的问题与此相反-我需要将cookies从
WKWebView
复制到共享存储,以便它们可以在
nsursession
中使用。
[[[[webView configuration] websiteDataStore] httpCookieStore] setCookie:cookie completionHandler:^{
    NSLog(@"Added cookie: %@", cookie);
}];