0

我正在尝试与 UIWebView 共享 WKWebView Cookie 以获取所有 cookie。我知道从 UIWebView 获取所有 cookie 作为比较 WKWebView 非常简单。

我在选项卡式应用程序模板中创建了两个 WebView(WKWebView、UIWebView)。我使用以下方法与 UIWebView 共享 WKWebView cookie 但没有成功。

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {

     let response = navigationResponse.response as? HTTPURLResponse
     let cookies = HTTPCookie.cookies(withResponseHeaderFields: response?.allHeaderFields as! [String : String], for: (response?.url)!)

     HTTPCookieStorage.shared.cookieAcceptPolicy = HTTPCookie.AcceptPolicy.always

     for cookie in cookies {
     HTTPCookieStorage.shared.setCookie(cookie)
     }

    decisionHandler(WKNavigationResponsePolicy.allow);
 }

当我从 WKWebView 登录到我的帐户时,使用上面的代码,UiWe​​bView 还没有登录我。我还尝试与 WKWebView 共享 UIWebView Cookie,并且成功了。

请谁能告诉我如何与 UIWebView 共享 WKWebView Cookie 或如何从 WKWebView 获取所有 Cookie?

谢谢

4

2 回答 2

0

您需要按照以下步骤设置 wkwebview cookie

初始化中首先是执行脚本来设置Cookies:</p>

-(void)initWebView
{
    WKWebViewConfiguration *webViewconfiguration = [[WKWebViewConfiguration alloc] init];
    WKUserContentController *wkUController = [[WKUserContentController alloc] init];
    if(URL.host hasSuffix:baseDomain){
    //Here to determine whether the domain name is their own website
        NSString *jScript = [self setCookies];
        WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
                    [wkUController addUserScript:wkUScript];
}
    webViewconfiguration.userContentController = wkUController;
    WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, width, height) configuration:webViewconfiguration];
}
//The script that executes may be slightly different
+(NSString *)setCookies
{
     NSString *script = [NSString string];

    for (NSHTTPCookie *httpCookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies])
    {
       NSString *cookie = [NSString stringWithFormat:@"%@=%@;domain=%@;path=%@",httpCookie.name,httpCookie.value,httpCookie.domain,httpCookie.path?:@"/"];
       script = [script stringByAppendingString:[NSString stringWithFormat:@"document.cookie='%@';",cookie]];

    }
    return script;
}

然后在创建 NSURLRequest 对象时手动将 cookie 添加到 HTTP 的头部:

- (void)loadRequest:(NSURLRequest *)request
{
    //Here to determine whether the domain name is their own website
    if ([request.URL.host hasSuffix:baseDomain]){
        NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:request.URL];
        NSString *cookies = @""; //setting Cookies
        [mutableRequest addValue:cookies forHTTPHeaderField:@"Cookie"];
}
    // do request  
}
于 2017-09-04T02:20:16.797 回答
0

设置 cookie 和加载 webview 真的很痛苦,在加载 webview 之前设置 cookie 很棘手。如果您仅在委托方法中设置 cookie,则它永远不会第一次加载页面。在加载页面之前,您必须注意 cookie 已完成。您可以在其他问题中查看我的答案,但速度很快,但您可以在目标 c 中遵循相同的技术。我可以设置 WKWebView 使用的 cookie 吗?

于 2018-09-27T05:27:00.807 回答