NSData contentsOfUrl 返回 nil。

6

我在StackOverflow上找到了几个类似的问题,但它们都没有解决我的问题。

我正在尝试从URL获取图像。这是我的方法:

let url = NSURL(string: "http://pic3.zhimg.com/8161ba9638273e0fb1a0201789d22d8e_m.jpg")
let data = NSData(contentsOfURL: url!)
let image = UIImage(data: data!)

但是我收到了一个错误,告诉我data是空的。

我该如何解决?谢谢。

更新

这里是一些错误截图:

enter image description here enter image description here


1
你的代码完全正常工作。我认为你获取不到数据是因为某些网络问题或限制。我在我的 playground 中检查了相同的代码,并且获得了结果。 - Midhun MP
@Larme 哦,是的!我忘记将此域名添加到 info.plist 文件中了。谢谢! :) - hklel
5
真的吗?!你真的想在主线程上使用同步请求来从外部资源获取图像吗?为什么人们从不阅读文档呢?!“不要使用此同步方法来请求基于网络的URL。对于基于网络的URL,此方法可能会在缓慢的网络上阻塞当前线程长达数十秒,导致用户体验差,在iOS中可能会导致应用程序被终止。”(来源) - holex
1
@holex 我完全忘记了,哈哈... 你是真正的MVP。 - Lamour
@holex 谢谢提醒。我会去查看一下。 - hklel
显示剩余2条评论
2个回答

15

可能是由于苹果的新应用传输安全功能拒绝了非HTTPS请求所致。要解决这个问题,您需要修改您的应用程序的 Info.plist 文件。您可以为特定域名定义异常处理方式。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>pic3.zhimg.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

或者完全禁用ATS

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

这个页面有一张很有用的图片:https://dev59.com/o10Z5IYBdhLWcg3wnBb_#33712228 - Andrew Rondeau

3

我认为,在所有之前,你应该创建一个弹性的代码。

if let url = NSURL(string: "http://pic3.zhimg.com/8161ba9638273e0fb1a0201789d22d8e_m.jpg")
{ 
    if let data = NSData(contentsOfURL: url) 
    {
        if let image = UIImage(data: data) 
        {
            //Do something
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接