【问题标题】:NSData contentsOfUrl returns nilNSData contentsOfUrl 返回 nil
【发布时间】:2015-12-10 15:02:09
【问题描述】:

我在 StackOverflow 上发现了几个类似的问题,但没有一个能解决我的问题。

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

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

但我收到一条错误消息,告诉我data 为零。

我该如何解决这个问题?谢谢。

更新

以下是一些错误截图:

【问题讨论】:

  • 您的代码运行良好。我认为由于某些网络问题/限制,您得到的数据为零。我在操场上检查了相同的代码,我得到了结果。
  • @MidhunMP 我在操场上试过了,它奏效了。但是当我在一个新创建的项目的viewDidLoad 中运行它时,我得到了同样的错误
  • 试试NSData(contentsOfURL:option:error)。您可能会收到错误消息。这可能与 iOS9(以及要设置的应用传输安全性)缺少“https”有关吗?
  • 说真的……?!你真的想在主线程上使用同步请求从外部资源中获取图像吗?为什么人们从不阅读文档?! "不要使用这种同步方式来请求基于网络的URL。对于基于网络的URL,这种方法在慢速网络上会阻塞当前线程几十秒,导致用户体验很差,而在iOS中,可能会导致您的应用被终止。” (source)
  • @holex 我完全忘记了,哈哈……你才是真正的 MVP

标签: ios swift uiimage nsdata


【解决方案1】:

这可能是 Apple 的新应用传输安全性拒绝非 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>

【讨论】:

【解决方案2】:

我认为你首先应该创建一个有弹性的代码。

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
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 2016-02-15
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多