【问题标题】:iOS 10 Notification Content Extension: using NSURLSession?iOS 10 通知内容扩展:使用 NSURLSession?
【发布时间】:2016-07-08 15:43:50
【问题描述】:

我正在尝试在 iOS 10 中为本地通知创建一个新的通知内容扩展,其中负责内容扩展的通知视图控制器从网络下载图像并将其呈现在 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 吗?我的扩展程序是否可能在下载完成之前被杀死?如果是这样,我如何确保它没有被杀死,以便我可以下载和渲染图像?

【问题讨论】:

  • 我遇到了同样的问题,更改传输应用程序的安全性没有任何作用,也没有相关的日志,而且到目前为止我还没有看到任何文档在谈论它......

标签: ios notifications ios10


【解决方案1】:

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

您似乎使用通知 Service 扩展程序来下载任何其他内容。 Notification Content 扩展仅在您需要时负责提供自定义用户界面。

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

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

【讨论】:

  • 这不是正确的答案,哈哈。它正在结束,因为网络任务是异步的。
  • @Gukki5 不要创建信号量并阻止内容扩展。服务扩展是您想要获取和应用通知内容的地方。
  • 哦,我不知道内容扩展,但是我一直在使用带有服务扩展的信号量
  • 这似乎不是真的(至少在 iOS 11 上),因为我可以使用 URLSession 并在通知内容扩展中下载图像
【解决方案2】:

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

  1. 网址无效。
  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()

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2019-06-29
      • 2017-02-23
      相关资源
      最近更新 更多