iOS10 通知内容扩展:使用 NSURLSession?

iOS 10 Notification Content Extension: using NSURLSession?

我正在尝试在 iOS10 中为本地通知创建一个新的通知内容扩展,其中负责内容扩展的通知视图控制器从网络下载图像并将其呈现在 UIImageView 中。我使用适当的 Info.plist 设置了通知内容扩展目标,并且内容扩展非常适合简单的事情,例如呈现带有某些内容的标签,例如模板中的示例代码:

func didReceive(_ notification: UNNotification) {
    self.label.text = notification.request.content.body
}

然而,当我尝试将 NSURLSession(或 Swift 3 中的 URLSession)引入混合时,通知内容完全无法加载 - 甚至标签都不再设置:

func didReceive(_ notification: UNNotification) {

    self.label.text = notification.request.content.body
    let session = URLSession.shared()
    let url = URL(string: "https://chart.googleapis.com/chart?cht=p3&chs=250x100&chd=t:60,40&chl=Hello|World")!

    let task = session.downloadTask(with: url) { (fileURL, response, error) in
        if let path = fileURL?.path {
            DispatchQueue.main.async {
                self.imageView.image = UIImage(contentsOfFile:path)
            }
        }
    }
    task.resume()
}

是否不允许在通知内容扩展中使用NSURLSession?我的扩展程序是否可能在下载完成之前被杀死?如果是这样,我如何确保它不会被杀死,以便我可以下载并渲染图像?

在 Info.plist 中为您的扩展禁用应用程序传输安全。 提示:将文件从 tmp 文件夹移动到缓存以保存

在内容扩展中调用 func didReceive(_ notification: UNNotification) 时,对内容的任何修改(例如下载图片)应该已经发生。

您似乎使用通知 服务 扩展来下载任何附加内容。 Notification Content 扩展仅负责在您需要时提供自定义用户界面。

在您的服务扩展中,您使用通知负载中的 url 下载图像,并将其设置为 UNNotification 对象上的附件。如果您不需要任何自定义 UI,系统将自动显示视频或图像等视觉媒体附件。如果这符合您的需要,您实际上根本不需要通知内容扩展。

Pusher 在 iOS 10 right here.

上提供了关于设置通知服务扩展以处理推送通知中的媒体附件的精彩教程

实际上可以在 Notification Content Extension 中下载图像。但是,您的代码包含两个问题:

  1. URL 无效。
  2. 一旦函数用完范围,downloadTask 方法返回的 fileURL 就会被删除,当您尝试从另一个访问 fileURL 时已经是这种情况线。相反,最好在数据变量中捕获 fileURL 内容并使用它在主线程中生成图像

稍微更正的代码:

guard let url = URL(string: "https://betamagic.nl/images/coredatalab_hero_01.jpg") else {
    return
}

let task = URLSession.shared.downloadTask(with: url) { (fileURL, response, error) in
    if let fileURL = fileURL,
        let data = try? Data(contentsOf: fileURL) {
        DispatchQueue.main.async {
            self.imageView.image = UIImage(data: data)
        }
     }
}
task.resume()