gpt4 book ai didi

ios - 使用 ssl 的同步子类 NSURLConnection?

转载 作者:行者123 更新时间:2023-11-29 10:44:22 24 4
gpt4 key购买 nike

我将 NSURLConnection 子类化,以便使用 ssl 调用网络服务。我考虑过同步连接,而不仅仅是像现在这样的异步连接。

我的代码:

#import "SecureSSLConnection.h"

static NSMutableArray *sharedConnectionList = nil;

@implementation SecureSSLConnection
@synthesize request, completionBlock, internalConnection;

- (id)initWithRequest:(NSMutableURLRequest *)req
{
self = [super init];
if (self) {
self.request = req;
}
return self;
}

- (void)start
{
container = [NSMutableData new];
internalConnection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:YES];

if (!sharedConnectionList) {
sharedConnectionList = [NSMutableArray new];
}
[sharedConnectionList addObject:self];
}

#pragma mark - NSURLConnectionDelegate

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

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if (self.completionBlock) {
self.completionBlock(container, nil);
}

[sharedConnectionList removeObject:self];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
if (self.completionBlock) {
self.completionBlock(nil, error);
}

[sharedConnectionList removeObject:self];
}

#pragma mark - SSL Connection Addition

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog(@"challenge.protectionSpace.host: %@", challenge.protectionSpace.host);

if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
// We only trust our own domain
if ([challenge.protectionSpace.host isEqualToString:WebSiteURL]) {
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
[challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
}
}

[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

我开始考虑实现:

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error

为了和原来的delegate保持一致。

一种方法是使用 NSNotificationCenter,但我的目标是更简单的方法。

我应该怎么做?

最佳答案

我不建议同步。您总是希望保持网络请求异步。

简单的解决方案是使用您的完成 block 属性。只需将依赖于您的初始 SSL 请求的其他任务放在第一个请求的完成 block 中。这样一来,它们将在第一个完成之前不会开始。

更优雅的解决方案是更进一步,将您的 SSL 请求包装在并发的 NSOperation 子类中。这样,您不仅可以使用上述完成 block 模式,还可以使用后续操作的 addDependencyNSOperationQueuemaxConcurrentOperationCount 来真正细化各种操作之间的动态。这很重要,但您可以查看 AFNetworking 作为此模式的相对深思熟虑的实现示例。

关于ios - 使用 ssl 的同步子类 NSURLConnection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22916578/

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