3

我刚刚开始学习 ios 开发,我正在尝试从使用 ssl 的网站获取图像,当我通过浏览器(笔记本电脑)连接到该网站时,会出现一条警告说根证书不受信任,我是不是网站的所有者,但我可以完全信任它。我的第一次尝试:

self.eventImage.image = [UIImage imageWithData:
[NSData dataWithContentsOfURL:
[NSURL  URLWithString:imageUrl]]];

所以我得到这个错误

NSURLConnection/CFURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9807)

我试图通过启动 ios 网络浏览器将用户发送到图片链接,当他们这样做时,他们会收到一条消息,询问他们是否可以信任它,如果他们点击是,图像将出现,但是我想要图像出现在应用程序内部。

我也尝试过使用网络视图,但它没有用。

这里的大多数类似问题都建议使用这个

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

- (void)connection:(NSURLConnection *)
  connection didReceiveAuthenticationChallenge:
  (NSURLAuthenticationChallenge *)challenge {
     NSString *imageUri =[self.detailItem objectForKey: @"image"];
     NSArray *trustedHosts = [[NSArray alloc]initWithObjects:imageUri, nil];
     if ([challenge.protectionSpace.authenticationMethod   
         isEqualToString:NSURLAuthenticationMethodServerTrust])
        if ([trustedHosts containsObject:challenge.protectionSpace.host])
               [challenge.sender useCredential:[NSURLCredential credentialForTrust:
                challenge.protectionSpace.serverTrust] forAuthenticationChallenge:
                challenge];

 [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

但是当我添加它们时,这两种方法从未被调用过。

4

4 回答 4

2

尝试添加这两种方法

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

-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
于 2013-11-12T23:34:45.930 回答
1

rmaddy、user2179059 和 Anindya Sengupta 的回答有助于解决此问题。

首先,我NSURLConnection明确地使用了,为了安全连接,我使用了这种方法(从这篇文中得到)

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

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:
(NSURLAuthenticationChallenge *)challenge {
if ([challenge.protectionSpace.authenticationMethod
      isEqualToString:NSURLAuthenticationMethodServerTrust]) {
      // instead of XXX.XXX.XXX, add the host URL, 
      // if this didn't work, print out the error you receive.
    if ([challenge.protectionSpace.host isEqualToString:@"XXX.XXX.XXX"]) {
        NSLog(@"Allowing bypass...");
        NSURLCredential *credential = [NSURLCredential credentialForTrust:
                                       challenge.protectionSpace.serverTrust];
        [challenge.sender useCredential:credential
             forAuthenticationChallenge:challenge];
    }
 }
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

这与 user2179059 的不同之处在于仅限制与该主机的不安全连接。

于 2013-11-13T11:08:28.550 回答
1

更改您的代码。而不是使用NSData dataWithContentsOfURL:你需要使用你自己的显式NSURLConnection. 然后,您可以使用适当的NSURLConnectionDelegate方法。

另一种选择是使用流行的AFNetworking 库

于 2013-11-12T23:35:40.547 回答
0

我希望你在 .h 文件的接口中包含了 NSURLConnectionDelegate 协议?

@interface ConnectionExampleViewController : UIViewController <NSURLConnectionDelegate>
于 2013-11-12T23:23:08.110 回答