gpt4 book ai didi

ios - 从 NSURLConnectionDataDelegate 设置内容时 UIWebView 重新加载 baseUrl

转载 作者:行者123 更新时间:2023-11-29 12:56:11 26 4
gpt4 key购买 nike

我正在尝试创建一个基于 UIWebView 的应用程序。其主要目的是为一些使用 NTLM 或 Basic 身份验证的网站提供身份验证,而无需用户在更改密码时为每个网站输入用户名/密码(网站共享用户/密码数据库)。

为了做到这一点,我“覆盖”了 UIWebView 的页面数据加载,这样我就可以拦截 HTTP 响应代码并在每次我访问时询问用户密码检测到 401 Unauthorized 响应。

我设置了一个 NSURLConnectionDataDelegate 来处理这样的请求:

@interface LPURLConnectionDelegate : NSObject<NSURLConnectionDataDelegate>
{
UIWebView* _webView;
NSMutableURLRequest* _request;
NSURLConnection* _connection;
NSString* _encoding;
NSString* _mimeType;
NSMutableData* _data;
}

- (LPURLConnectionDelegate*) initWithWebView:(UIWebView *)webView;

- (void) loadPageWithRequest: (NSURLRequest*)request;

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

@end

@implementation LPURLConnectionDelegate
- (void) loadPageWithRequest: (NSURLRequest*)request
{
_request = [request mutableCopy];
if(!_data)
{
_data = [NSMutableData dataWithCapacity:0];
[_data retain];
}
[_data setLength:0];
if(_connection)
{
[_connection cancel];
[_connection release];
_connection = nil;
}
_connection = [[NSURLConnection alloc] initWithRequest:_request delegate:self startImmediately:YES];
}

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
LPAppDelegate* delegate = [LPAppDelegate getInstance];
NSURLCredential* credential = [NSURLCredential credentialWithUser:[delegate getUsername] password:[delegate getPassword] persistence:NSURLCredentialPersistenceForSession];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
//handle connection failed
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"Connection did receive response");
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
_mimeType = [httpResponse MIMEType];
_encoding = [httpResponse textEncodingName];
//handle status - if the status is 401, the connection is canceled and the user is asked for his new password
}

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection
{
return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[_data appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[_webView loadData:_data MIMEType:_mimeType textEncodingName:_encoding baseURL:[_request URL]];
}

@end

我的 UIWebViewDelegate 看起来像这样:

@interface LPWebViewDelegate : NSObject<UIWebViewDelegate>

- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

@end


@implementation LPWebViewDelegate

- (void) webViewDidStartLoad:(UIWebView *)webView
{
}

- (void) webViewDidFinishLoad:(UIWebView *)webView
{
//handle success
}

- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
LPURLConnectionDelegate* connectionDelegate = [[LPURLConnectionDelegate alloc] initWithWebView:webView];
[connectionDelegate loadPageWithRequest:request];
return NO;
}

- (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
//handle fail
}

@end

基本上,我要做的是告诉 UIWebView 不要自行加载任何页面,让我处理加载页面的请求。当请求完成并且用户通过身份验证时,我尝试使用 UIWebView::loadData:MIMEType:textEncodingName:baseUrl 方法设置数据。

这里的问题是,在从 NSURLConnectionDataDelegate 设置 UIWebView 的数据后,UIWebView 重新加载设置为 的页面baseURL(至少在模拟器中 - 我还没有在实际设备上尝试过代码)。

有谁知道一种方法可以将数据设置到 UIWebView 而不会重新加载页面 (*)?

*) 我知道我可以让 UIWebView 在我让 NSURLConnection 检查身份验证(或并行)后加载页面,但我尽量避免为每个页面请求两次页眉。

注意:代码不完整,我已经提取了我认为与此问题最相关的部分。

最佳答案

实现NSURLProtocol类(class)。它本质上是一个抽象类,允许子类定义HTTP schemes的URL加载行为

查看本教程 here

关于ios - 从 NSURLConnectionDataDelegate 设置内容时 UIWebView 重新加载 baseUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com