iOS之WKWebview中cookie问题的解决办法

来源:互联网 发布:个人博客整站源码 编辑:程序博客网 时间:2024/06/01 08:49

       iOS8以后,苹果推出了新框架Wekkit,提供了替换UIWebView的组件WKWebView。各种UIWebView的问题没有了,速度更快了,占用内存少了,但是在使用过程中有雨不熟悉还是会出现不少问题,以下我只说明传cookie的坑

刚开始的时候我各种传cookie,但是cookie却只是在网页表层保存了,网页内部的链接并没有保存cookie。废话不多说,仅仅需要几行代码,即可实现。(网页内部有AJAX请求)

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"你的url"]];// 你所保存的cookie值    NSDictionary *dic = [[NSUserDefaults standardUserDefaults] valueForKey:@"cookie"];    NSString *cookie = [NSString stringWithFormat:@"%@=%@", [dic valueForKey:@"key"], [dic valueForKey:@"value"]];WKUserContentController *userContentController = WKUserContentController.new;        WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource: [NSString stringWithFormat:@"document.cookie = '%@';", cookie] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];        [userContentController addUserScript:cookieScript];        WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new;        webViewConfig.userContentController = userContentController;WKWebView *webview = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:webViewConfig];这样即可解决一个url内部多个跳转,cookie仍能保存的问题。

当然,如若网页之中没有很多嵌套的很多点击方法,可以尝试在- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler代理方法中解决问题
代码如下:

// API是根据WebView对于即将跳转的HTTP请求头信息和相关信息来决定是否跳转- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{    // 你所保存的cookie    NSDictionary *dic = [[NSUserDefaults standardUserDefaults] valueForKey:@"cookie"];    NSString *cookie = [NSString stringWithFormat:@"%@=%@", [dic valueForKey:@"key"], [dic valueForKey:@"value"]];    // 如果请求头部不包含cookie值则需要我们去传cookie    if ([navigationAction.request allHTTPHeaderFields][@"Cookie"] && [[navigationAction.request allHTTPHeaderFields][@"Cookie"] rangeOfString:cookie].length > 0) {        decisionHandler(WKNavigationActionPolicyAllow);    } else {        NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:navigationAction.request.URL];        [request setValue:cookie forHTTPHeaderField:@"Cookie"];        [webView loadRequest:request];        decisionHandler(WKNavigationActionPolicyCancel);    }}


                                             
0 0
原创粉丝点击