Ios 通过身份验证从web获取图像

Ios 通过身份验证从web获取图像,ios,iphone,objective-c,uiimageview,nsurl,Ios,Iphone,Objective C,Uiimageview,Nsurl,在我的iOS应用程序中,我需要从web加载一个图像,但该图像位于需要提供用户名和密码的服务器上。我尝试使用以下代码: - (void) loadImageFromWeb:(NSString *)urlImg { NSURL* url = [NSURL URLWithString:urlImg]; NSURLRequest* request = [NSURLRequest requestWithURL:url]; [NSURLConnection sendAsynch

在我的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.)"}

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

您可以尝试将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


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

此GitHub问题表明您的服务器使用的SSL证书不正确:

但如果是凭证问题,我建议查看NSURLCondential

您可以在委托方法中将凭据呈现给NSURLConnection,或者将它们存储一次,然后让它们用于所有请求


或者,您可以考虑使用RestKit。

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

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文件并将其导入到项目中。
添加标题#在您的实现文件中导入“Base64.h”。

您可以检查
NSURLCredential
检查此链接我正在尝试您的解决方案,但当我将您粘贴的代码插入此处时,Xcode无法识别方法
base64encodestringwithoptions
,我应该导入什么才能使用此方法?在我的课堂上,我添加了类别
NSData+Base64
@lucgian841。我编辑了Base64.h/.m文件的答案,并更新了转换方法。如果您使用的是iOS7,您可以使用下面的Base64编码方法。-(NSString*)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)选项;