gpt4 book ai didi

ios - 使用带有完成处理程序的 NSURLConnection sendAsynchronousRequest 进行身份验证

转载 作者:技术小花猫 更新时间:2023-10-29 10:29:39 28 4
gpt4 key购买 nike

通常我喜欢使用完成处理程序 block 使用 NSURL 的 sendAsynchronousRequest 类方法“触发并忘记”,但当需要身份验证时,这似乎不是一个选项。

当使用这样的完成处理程序样式请求时:

[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.mysite.com/"]]
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {


//Do Stuff

}];

处理身份验证的正确方法是什么?我是否需要分配和初始化 NSURLConnection 并设置委托(delegate)而不是使用此类方法样式?我想我了解如何使用委托(delegate)函数正确进行身份验证,但我想弄清楚是否可以将其包含在 completionHandler block 中,或者是否有更好的方法来执行此操作。

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{

if ([challenge previousFailureCount] > 0) {
NSLog(@"Authentication Failure");
[connection cancel];
}
else
{

NSURLCredential *credential = [NSURLCredential credentialWithUser:self.username
password:self.password
persistence:NSURLCredentialPersistenceForSession];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}

}

最佳答案

我认为 completionHandler 方法是针对基本请求的。也许您可以考虑使用 AFNetworking,因为我将其与 block 方法和身份验证一起使用。

编辑....您是否尝试过将身份验证 header 添加到 NSURLRequest?创建一个 NSMutableURLRequest:

NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.example.com/"]];

然后像这样添加身份验证 header :

NSString *basicAuthCredentials = [NSString stringWithFormat:@"%@:%@", userName, password];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", AFBase64EncodedStringFromString(basicAuthCredentials)];
[urlRequest setValue:authValue forHTTPHeaderField:@"Authorization"];

AFBase64EncodedStringFromString 函数是这样的:

static NSString * AFBase64EncodedStringFromString(NSString *string) {
NSData *data = [NSData dataWithBytes:[string UTF8String] length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
NSUInteger length = [data length];
NSMutableData *mutableData = [NSMutableData dataWithLength:((length + 2) / 3) * 4];

uint8_t *input = (uint8_t *)[data bytes];
uint8_t *output = (uint8_t *)[mutableData mutableBytes];

for (NSUInteger i = 0; i < length; i += 3) {
NSUInteger value = 0;
for (NSUInteger j = i; j < (i + 3); j++) {
value <<= 8;
if (j < length) {
value |= (0xFF & input[j]);
}
}

static uint8_t const kAFBase64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

NSUInteger idx = (i / 3) * 4;
output[idx + 0] = kAFBase64EncodingTable[(value >> 18) & 0x3F];
output[idx + 1] = kAFBase64EncodingTable[(value >> 12) & 0x3F];
output[idx + 2] = (i + 1) < length ? kAFBase64EncodingTable[(value >> 6) & 0x3F] : '=';
output[idx + 3] = (i + 2) < length ? kAFBase64EncodingTable[(value >> 0) & 0x3F] : '=';
}

return [[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding];
}

然后调用您之前调用的函数,但使用新的 NSURLRequest:

[NSURLConnection sendAsynchronousRequest:urlRequest
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

}];

关于ios - 使用带有完成处理程序的 NSURLConnection sendAsynchronousRequest 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12828060/

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