为什么 sdwebimage 启用 App Transport Security Setting 后可以成功加载图像?

Why sdwebimage can load image successfully when App Transport Security Setting is enabled?

由于 Apple 将强制我们从 2017 年开始启用 ATS,我正在做一些调查工作,但对 SDWebImage class 有一些疑问。

如果我使用下面的代码,图像将加载成功

[self.myImageView sd_setImageWithURL:[NSURL URLWithString:@"http://f.hiphotos.baidu.com/image/h%3D200/sign=1c3f18c4524e9258b93481eeac83d1d1/b7fd5266d0160924be0452bbd00735fae6cd3468.jpg"]];

但是如果我使用NSData中的方法,则不会加载图像。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://f.hiphotos.baidu.com/image/h%3D200/sign=1c3f18c4524e9258b93481eeac83d1d1/b7fd5266d0160924be0452bbd00735fae6cd3468.jpg"]];

    UIImage *image = [UIImage imageWithData:data];

    dispatch_async(dispatch_get_main_queue(), ^{
        self.myImageView.image = image;
    });
});

SDWebImage是怎么做到的?

确保您的 Info.plist 文件中没有设置“NSAllowsArbitraryLoads”。

据我所知,SDWebImage 受到与所有其他应用程序相同的 ATS 限制。

例如,当我将您的 URL 插入 SDWebImage 的演示应用程序(in their MasterViewController.m 文件)并关闭 ATS 异常时,我在 Xcode控制台。

不太可能,但有可能,万一​​加载失败,SDWebImage查看NSURL方案,如果是@"http:",则将其更改为@"https:"?

NSString *absoluteString = url.absoluteString;
if ([absoluteString hasPrefix:@"http:"]) {
    url = [NSURL URLWithString:[@"https:" stringByAppendingString:[absoluteString substringFromIndex:5]]];
}

可能会从缓存中获取图像,因为这是 sdwebimage 在将请求发送到 url 之前首先检查的地方。