我們是工程師 ——加油 !
1問(wèn)題描述
使用SDwebImage去加載含有逗號(hào)的url 時(shí)候會(huì)無(wú)法加載泣洞,但是在瀏覽器上顯示正常忧风。
報(bào)錯(cuò):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
輸出臺(tái)
報(bào)錯(cuò).png
我知道遇到問(wèn)題都急于解決,所以先寫解決方案球凰,后寫分析
2 解決方法:
找到UIImageView+WebCache.m文件狮腿,
在統(tǒng)一下載圖片入口前面添加如下代碼(當(dāng)然,
用戶代理的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.問(wèn)題分析
這是因?yàn)槿鄙?User-Agent 用戶代理缘厢。
看到別人的博文上面解釋的用戶代理是這么解釋的:用戶代理 User Agent,是指瀏覽器甩挫,它的信息包括硬件平臺(tái)贴硫、系統(tǒng)軟件、應(yīng)用軟件和用戶個(gè)人偏好伊者。
設(shè)置用戶代理格式例如:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
個(gè)人的理解是 : 設(shè)置了用戶代理英遭,才能訪問(wèn)到這張圖片。至于這個(gè)用戶代理的格式亦渗,只要有值或者約定的特定格式字符串都可以挖诸。
4.補(bǔ)充:
有些時(shí)候,雖然圖片的url是自己公司的央碟,不需要設(shè)置用戶代理,但是由于含有了特殊符號(hào)或者中文漢字,仍然會(huì)造成不能加載的情況,針對(duì)這個(gè)問(wèn)題亿虽,可以用下邊的方法菱涤;
# 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:含有< 中文漢字> 和 < 特殊符號(hào)> 的url鏈接
#方法3:
NSString *utf8_string3 = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)url_string,(CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]",NULL,kCFStringEncodingUTF8));
Copyright ? 著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)洛勉,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處粘秆。