WKWebview cookie 问题?

WKWebview cookie issue?

背景:

我正在升级我的应用程序以使用 UIWebview 中的 WKWebview,因为它将 no longer be accepted by App Store

The App Store will no longer accept new apps using UIWebView as of April 2020 and app updates using UIWebView as of December 2020.

问题:

发生的事情是,我在登录后从 Webview (WKWebview) 获取 cookie return。我将检索 API 触发所需的令牌,但是我不断点击 所有 API(s) 被触发的 HTTP 401 状态。

如果我恢复到 UIWebview,并重复相同的登录操作,但重新使用来自 WKWebview 的 SAME TOKEN。我正在获得 HTTP 200 状态。重复使用同一个令牌的目的是为了证明这是一个有效的令牌。

请注意,我没有对调用 API 的方法进行任何更改。 WKWebview 和 UIWebview 都是一样的。 (包括POST方法的对象请求)

我在 WKWebview 中遗漏了什么吗?

我是否需要设置 cookie 或允许任何特定的内容?

代码片段:

<WebView
            style={{ width: this.state.webviewWidth }}
            ref={(component) => {
              this.webviewRef = component;
            }}
            source={{ uri: this.state.url }}
            onLoadStart={this.webviewOnLoadStart}
            onLoad={this.webviewOnLoadEnd}
            onNavigationStateChange={this.onNavigationStateChange}
            useWebKit={true}
            sharedCookiesEnabled={true}
          />

Pacakge.json

"react-native": "0.61.5",
"react-native-webview": "^10.3.2",
"@react-native-community/cookies": "^3.0.0",

显然问题是 WKWebview 不处理 cookie 传递给我们的请求 header。因此,每次到达服务器时,我都会收到 401 身份验证失败。

不幸的是 React-Native-Webview 没有办法处理这个 cookie header 开箱即用(如果我错了请纠正我)。我完全了解 lib 中提供的这个 'custom header' 函数,不幸的是它没有按预期工作。 cookie 仍然不是请求的一部分 header.

我的解决方案如下,在方法 decidePolicyForNavigationAction:

下完成
  1. 深入了解本机库 (React-Native-Webview)
  2. 遍历 websiteDataStore.httpCookieStore
  3. 中所有现有的 cookie
  4. 寻找我的cookie(当然,你应该知道你的cookie名称)
  5. 将 cookie 附加到 HTTPHeaderField 到您的 http 请求
  6. 再次加载http请求!
if (@available(iOS 11.0, *)) {
          [webView.configuration.websiteDataStore.httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> * _Nonnull cookies) {
              NSLog(@"All cookies in websiteDataStore %@", cookies);
              for(NSHTTPCookie *cookie in cookies){
                  if([cookie.name isEqualToString:@"coookieName"]){
                      if([navigationAction.request valueForHTTPHeaderField:@"Cookie"] != nil ){
                          
                      }else{
                          NSMutableURLRequest *req = [request mutableCopy];
                          NSString *newCookie = [NSString stringWithFormat:@"cookieName=%@" , cookie.value];

                          // As you can see, I'm appending the cookie value into header myself 
                          [req addValue:newCookie forHTTPHeaderField:@"Cookie"];
                          [req setHTTPShouldHandleCookies:YES];
                          [webView loadRequest:req];
                          return;
                      }
                  }
              }
          }];
      } else {
          // Fallback on earlier versions
      }