Ios 通过身份验证从web获取图像
在我的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
- (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)选项;