我对Objective-C有点新,但遇到了一个我无法解决的问题,主要是因为我不确定我是否正确实现了解决方案。
我正在尝试使用同步连接连接到具有自签名证书的https站点。我正在接受
错误域= NSURLErrorDomain代码= -1202“不受信任的服务器证书”
我在这个论坛上看到了一些解决方案的错误。我找到的解决方案是添加:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
到NSURLDelegate接受所有证书。当我仅使用:
连接到网站时NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://examplesite.com/"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
它工作正常,我看到接受的挑战。但是当我尝试使用同步连接进行连接时,我仍然会收到错误,并且在进行日志记录时我没有看到调用挑战函数。
如何让同步连接使用质询方法?是否与委托有关:URLConnection的自我部分?我也有记录在NSURLDelegate中发送/接收数据,该数据由我的连接函数调用,而不是由同步函数调用。
我正在使用的同步部分:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:@"https://examplesite.com/"]];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: [[NSString stringWithString:@"username=mike"] dataUsingEncoding: NSUTF8StringEncoding]];
dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"%@", error);
stringReply = [[NSString alloc] initWithData:dataReply encoding:NSUTF8StringEncoding];
NSLog(@"%@", stringReply);
[stringReply release];
NSLog(@"Done");
就像我提到的,我对目标C有点新意,所以要善良:)
感谢您的帮助。 麦克
答案 0 :(得分:7)
根据Apple文档(URL Loading System Programming Guide),不建议使用同步NSURLRequest方法,因为“因为它有严重的限制”。似乎缺乏控制哪些证书可接受的能力是这些限制之一。
是的,你是对的,delegate:self
设置上的NSURLConnection
导致你的委托方法被调用。由于简单(或简单)同步sendSynchronousRequest:
调用未提供指定委托的方法,因此不使用这些委托方法。