1

在我的 iOS 应用程序中,我需要从 Web 加载图像,但该图像位于需要提供用户名和密码的服务器上。我尝试使用此代码:

 - (void) loadImageFromWeb:(NSString *)urlImg {
    NSURL* url = [NSURL URLWithString:urlImg];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];


    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse * response,
                                               NSData * data,
                                               NSError * error) {
                               if (!error){
                                   UIImage* image = [[UIImage alloc] initWithData:data];
                                   [self.imageObjectScanned setImage:image];
                               } else {
                                   NSLog(@"ERRORE: %@", error);
                               }

                           }];
}

但它返回一个错误并说:

Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. (NSURLErrorDomain error -1012.)" UserInfo=0x14e6b420 {NSErrorFailingURLKey=http://54.204.6.246/magento8/media/catalog/product/cache/0/image/9df78eab33525d08d6e5fb8d27136e95/s/c/scheda_non_shop.jpg, NSErrorFailingURLStringKey=http://54.204.6.246/magento8/media/catalog/product/cache/0/image/9df78eab33525d08d6e5fb8d27136e95/s/c/scheda_non_shop.jpg, NSUnderlyingError=0x14e695c0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1012.)"}

我猜这个错误是因为我没有发送用户名和密码。如何发送用户名和密码来加载此图像?

4

3 回答 3

2

尝试在请求对象的标头中添加基本身份验证。

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

NSString *authCredentials = [NSString stringWithFormat:@"%@:%@", userName, password];
NSString *authValue = [NSString stringWithFormat:@"Basic %@",[authCredentials base64EncodedStringWithWrapWidth:0]];
[urlRequest setValue:authValue forHTTPHeaderField:@"Authorization"];
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse * response,
                                           NSData * data,
                                           NSError * error) {
                           if (!error){
                               UIImage* image = [[UIImage alloc] initWithData:data];
                               [self.imageObjectScanned setImage:image];
                           } else {
                               NSLog(@"ERRORE: %@", error);
                           }

                       }];

从此处下载 Base64.h/.m 文件并将其导入您的项目。在您的实现文件中添加标题#import "Base64.h"。

于 2013-11-08T13:09:13.803 回答
0

您可以尝试将 URL 中的凭据作为查询组件传递,如官方文档中所述:

如果需要身份验证才能下载请求,则必须将所需凭据指定为 URL 的一部分。如果身份验证失败或缺少凭据,则连接将尝试在没有凭据的情况下继续。

构成查询组件的参数需要正确编码。您可以使用此方法对此答案中显示的 URL 的参数进行编码。

例如:

NSDictionary* parameters = @{@"login": name, @"password": password};
NSData* queryComponent = [parameters dataFormURLEncoded];
NSString* queryComponentString = [NSString alloc] initWithData:queryComponent
                                              encoding:NSUTF8StringEncoding];
NSString* urlString = [NSString stringWithFormat:@"%@?%@", 
                                   urlImg, queryComponentString];    
NSURL* url = [NSURL URLWithString: urlString]; 

一个小警告:

所描述的对包含在 URL 的查询组件中的参数进行编码的方法严格遵循 w3c 指定的建议算法:应应用于 URL的 application/x-www-form-urlencoded 编码算法。

~此编码算法将在名称或值字符串中出现波浪字符时对其进行转义。但是,根据构成 URL的更一般规则(参见 RFC 3986),波浪号不应被转义。不过,我认为这永远不会成为问题。

于 2013-11-08T12:44:41.667 回答
0

此 GitHub 问题表明您的服务器使用了不正确的 SSL 证书: https ://github.com/RestKit/RestKit/issues/1511

但如果是凭据问题,我建议查看 NSURLCredential https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Classes/NSURLCredential_Class/Reference/Reference.html

您可以在委托方法中向 NSURLConnection 提供凭据,或者将它们存储一次并让它们用于所有请求。

或者,您可以查看使用 RestKit。

于 2013-11-08T12:46:43.573 回答