在 stringWithContentsOfURL cookie 后未保存在 UIWebView 中。 iOS

Posted

技术标签:

【中文标题】在 stringWithContentsOfURL cookie 后未保存在 UIWebView 中。 iOS【英文标题】:After stringWithContentsOfURL cookies not save in UIWebView. iOS 【发布时间】:2015-03-01 20:16:00 【问题描述】:

我想从 url 获取 html 并使用:

NSString *URLtoHTML = [NSString stringWithContentsOfURL:self.url encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:URLtoHTML baseURL:nil];

但在此之后,我的 cookie 在 UIWebView 中清理了。 但是,如果我使用没有 stringWithContentsOfURL cookie 的加载请求保存:

[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];

我试过了,但是cookies也没有保存:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

    [receivedData appendData:data];
    NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

如何获取 HTML 并使用 cookie 将其加载到 UIWebView 中?

更新: 如果我使用这种情况(两个不相关的行)cookie 也不会保存:

NSString *URLtoHTML = [NSString stringWithContentsOfURL:self.url encoding:NSUTF8StringEncoding error:nil];
[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];

stringWithContentsOfURL 不保存 cookie。怎么会这样?这很有趣:D

【问题讨论】:

【参考方案1】:

在这种情况下 - 您从 URL 下载原始内容,并仅在 WebView 中显示此数据。 WebView 只是不知道您的 cookie。

NSString *URLtoHTML = [NSString stringWithContentsOfURL:self.url encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:URLtoHTML baseURL:nil];

在这种情况下 - 您创建连接,但再次只下载原始数据。

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

    [receivedData appendData:data];
    NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

这个更接近,你所需要的 - 它从 WebView 捕获加载的数据。

[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];
NSString *html = [self.webView stringByEvaluatingjavascriptFromString: 
                                     @"document.body.innerHTML"];

【讨论】:

但在这种情况下我必须等待页面加载:-(void)webViewDidFinishLoad:(UIWebView *)webView NSString *html = [self.webView stringByEvaluatingJavaScriptFromString: @"document.body.内部HTML"]; 时间长了,不适合我。有什么建议吗?【参考方案2】:

我的解决方案:

首先我检查了从服务器获取的 Set-Cookie:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.simple.com/"]];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

    NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;
    NSDictionary *fields = [HTTPResponse allHeaderFields];
    NSString *cookie = [fields valueForKey:@"Set-Cookie"]; // It is cookie

我意识到我的价值在于禁用 cookie。 现在我首先发送一个启用 cookie 的请求:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.simple.com/"]];
[request addValue:myCustomCookies forHTTPHeaderField:@"Cookie"];

我的解决方案 2:

我发送带有帖子数据的请求

NSString *post = [NSString stringWithFormat:@"login=%@&passwors=%@",_login.text,_password.text];
        NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
        NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.simple.com/login"]]];
        [request setHTTPMethod:@"POST"];
        [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
        [request setHTTPBody:postData];
        request.timeoutInterval = 20;
        NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];

就是这样!祝大家好运!

【讨论】:

以上是关于在 stringWithContentsOfURL cookie 后未保存在 UIWebView 中。 iOS的主要内容,如果未能解决你的问题,请参考以下文章

JSON:NSString stringWithContentsOfURL ...流中有null,崩溃

在 Swift 中逐行读取文件/URL

仅在iPhone上获取HTTP标头字段

在 Xcode 11.3 中读取文档中的文件失败

分配的变量引用在哪里,在堆栈中还是在堆中?

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记