iOS 11中Base64转图片触发NSURLConnection错误码-1022求助
解决NSURLConnection Error Code -1022(Base64转图片场景)
我之前也碰到过一模一样的问题,在iOS 11/Xcode 9环境下明明全局配置了ATS的NSAllowsArbitraryLoads,其他网络请求都正常,唯独转Base64图片时弹出-1022错误。先给你拆解问题核心,再给你直接能用的解决方案:
首先,错误码**-1022**对应的是NSURLErrorAppTransportSecurityRequiresSecureConnection,也就是ATS强制要求请求使用HTTPS安全连接。但你已经开了全局任意加载,说明问题根本不在常规网络请求上——你大概率用错了Base64转图片的方式。
很多开发者会误以为要把Base64包装成URL,再通过NSURLConnection去加载,但这完全是多此一举,反而会触发ATS的无意义检查(哪怕是本地的data URL,在iOS 11的特定场景下也可能被ATS拦截)。
正确的Base64转图片流程
直接将Base64字符串解码成NSData,再用UIImage初始化即可,不需要走任何网络请求:
Objective-C 示例
- (UIImage *)imageFromBase64String:(NSString *)base64String { // 移除Base64字符串可能带的前缀(比如"data:image/png;base64,") NSString *cleanedBase64 = [[base64String componentsSeparatedByString:@","] lastObject]; NSData *imageData = [[NSData alloc] initWithBase64EncodedString:cleanedBase64 options:NSDataBase64DecodingIgnoreUnknownCharacters]; return [UIImage imageWithData:imageData]; }
Swift 示例
func image(from base64String: String) -> UIImage? { // 处理可能的前缀 let cleanedString = base64String.components(separatedBy: ",").last ?? base64String guard let imageData = Data(base64Encoded: cleanedString) else { return nil } return UIImage(data: imageData) }
为什么之前的方式会出错?
如果你的代码里是把Base64拼接成data:image/png;base64,xxxx这类URL,再用NSURLConnection发起请求,iOS 11的ATS机制可能会对这个URL的“安全性”产生误判,哪怕它是本地的data scheme URL。直接解析Data生成图片才是最直接、最高效且不会触发ATS问题的方式。
额外检查点
- 确认Base64字符串没有格式错误(比如多余的空格、换行符),可以用
NSDataBase64DecodingIgnoreUnknownCharacters选项忽略无关字符 - 如果真的有特殊场景必须用URL加载,可以在ATS配置里针对data scheme添加例外,但完全没必要——直接解析Data的方案更简洁
内容的提问来源于stack exchange,提问作者Benjamin RD
相关产品推荐
相关产品推荐

