我尝试在iOS 10中为本地通知创建新的通知内容扩展,其中负责内容扩展的通知视图控制器从网络下载图像并在UIImageView中呈现它。我使用适当的Info.plist设置了Notification Content Extension目标,并且内容扩展可以很好地用于简单的事情,例如使用某些内容呈现标签,例如模板中的示例代码:
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?我的扩展程序可能在下载完成之前被杀死了吗?如果是这样,我怎么能确保它没有被杀死所以我可以下载并渲染图像?
答案 0 :(得分:0)
在内容扩展程序中调用func didReceive(_ notification: UNNotification)
时,应该已经发生了对内容的任何修改,例如下载图像。
您似乎使用通知服务扩展程序来下载任何其他内容。通知内容扩展程序仅负责在需要时提供自定义用户界面。
在服务扩展程序中,使用通知有效内容中的网址下载图像,并将其设置为UNNotification
对象上的附件。如果您不需要任何自定义UI,系统将自动显示视频或图像等可视媒体附件。如果这符合您的需求,您实际上根本不需要通知内容扩展。
Pusher提供了一个很棒的教程,用于设置通知服务扩展,以便在iOS 10 right here上的推送通知中处理媒体附件。
答案 1 :(得分:0)
实际上可以在Notification Content Extension
中下载图像。但是,您的代码包含两个问题:
fileURL
方法返回的downloadTask
将被删除,当您尝试从另一个线程访问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()
答案 2 :(得分:-1)
在Info.plist中为您的分机禁用应用传输安全性。 提示:将文件从tmp文件夹移动到缓存以进行保存