我们是工程师 ——加油 !
1问题描述
使用SDwebImage去加载含有逗号的url 时候会无法加载,但是在浏览器上显示正常。
报错:Error Domain=NSURLErrorDomain Code=-1100 "(null)"
接口例如:
- http://t12.baidu.com/it/u=2008602638,2106449332&fm=58
- http://t10.baidu.com/it/u=3972756261,2766805173&fm=58
代码.png
输出台
报错.png
我知道遇到问题都急于解决,所以先写解决方案,后写分析
2 解决方法:
找到UIImageView+WebCache.m文件,
在统一下载图片入口前面添加如下代码(当然,
用户代理的value也可以是其他格式,下面代码只做为参考)
- (void)sd_setImageWithURL:(NSURL *)url
placeholderImage:(UIImage *)placeholder
options:(SDWebImageOptions)options
progress:(SDWebImageDownloaderProgressBlock)progressBlock
completed:(SDWebImageCompletionBlock)completedBlock {
NSString *userAgent = @"";
userAgent = [NSString stringWithFormat:@"%@/%@ (%@; iOS %@; Scale/%0.2f)", [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleExecutableKey] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey], [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], [[UIScreen mainScreen] scale]];
if (userAgent) {
if (![userAgent canBeConvertedToEncoding:NSASCIIStringEncoding]) {
NSMutableString *mutableUserAgent = [userAgent mutableCopy];
if (CFStringTransform((__bridge CFMutableStringRef)(mutableUserAgent), NULL, (__bridge CFStringRef)@"Any-Latin; Latin-ASCII; [:^ASCII:] Remove", false)) {
userAgent = mutableUserAgent;
}
}
[[SDWebImageDownloader sharedDownloader] setValue:userAgent forHTTPHeaderField:@"User-Agent"];
}
...... /*这里省略SD源码*/
}
3.问题分析
这是因为缺少 User-Agent 用户代理。
看到别人的博文上面解释的用户代理是这么解释的:用户代理 User Agent,是指浏览器,它的信息包括硬件平台、系统软件、应用软件和用户个人偏好。
设置用户代理格式例如:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
个人的理解是 : 设置了用户代理,才能访问到这张图片。至于这个用户代理的格式,只要有值或者约定的特定格式字符串都可以。
4.补充:
有些时候,虽然图片的url是自己公司的,不需要设置用户代理,但是由于含有了特殊符号或者中文汉字,仍然会造成不能加载的情况,针对这个问题,可以用下边的方法;
# TODO:只含有<中文汉字>的url链接
NSString * url_string = @"https://img.chaboshi.cn/article/2017-05-02xinche封面.jpg";
#方法1:
NSString * utf8_string = [url_string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
#方法2:
NSString * utf8_string2 = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)url_string,NULL,NULL,kCFStringEncodingUTF8));
#TODO:含有< 中文汉字> 和 < 特殊符号> 的url链接
#方法3:
NSString *utf8_string3 = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)url_string,(CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]",NULL,kCFStringEncodingUTF8));
Copyright © 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。