如何在通知服务扩展中为通知内容扩展预加载资源

Posted

技术标签:

【中文标题】如何在通知服务扩展中为通知内容扩展预加载资源【英文标题】:How to preload resources in Notifications Service extension for Notifications Content extension 【发布时间】:2018-03-29 07:45:08 【问题描述】:

我有一个非常简单的任务。我已经实现了一个通知服务扩展以及一个通知内容扩展来实现丰富的通知。现在在扩展视图(通知内容扩展)中,我需要展示一张图片。为了使 UX 更流畅,我想在 Notifications Service 扩展中预加载它,然后在 Notifications Content 扩展中呈现它(我相信 Notifications Service 扩展就是为此而设计的)。

现在我知道了UNNotificationAttachment,我可以使用它来下载图像并将其添加到通知中。但是在通知的简短预览中会显示图像附件。我需要简短的预览以保持“干净”并且不显示此图像。

我知道我可以尝试使用 Core Data (SO question) 或其他一些共享存储 (UserDefaults)。但是使用它,我必须在处理通知后管理删除资源。这意味着我必须以某种方式找到一种方法来检测特定通知何时已被处理(解除/处理),这不是一件容易的事(例如,如果用户不会展开简短预览而是直接解除它,我需要删除资源 - 我该如何检测?)。

有解决这个问题的标准方法吗?系统根据需要清理一些临时存储吗?或者有没有办法添加UNNotificationAttachment 并将其配置为不在预览中显示?我更喜欢第一种方式,因为附件只支持媒体类型,而且通常我们可能需要预加载不同类型的资源(我知道这是一种极端情况,但它可能会发生)。

【问题讨论】:

【参考方案1】:

我找到了解决我当前问题的解决方法。如果附件链接了一个有效的图像文件,但使用了没有文件扩展名的标识符(因此没有“.png”、“.jpg”或“.gif”),则短预览不会显示图像的预览:

let imageFileIdentifier = "image" // instead of "image.png"
let imageAttachment = try UNNotificationAttachment.init(identifier: imageFileIdentifier, url: fileURL!, options: options)

这可能不是通用解决方案,因为正如文档所述:

如果附件已损坏、无效或文件类型不受支持,则不会安排发送通知请求。

所以我希望如果文件不是媒体文件,而是例如 JSON 中的序列化对象,则不会发送通知。

【讨论】:

以上是关于如何在通知服务扩展中为通知内容扩展预加载资源的主要内容,如果未能解决你的问题,请参考以下文章

如何在通知内容扩展中为我的自定义视图应用自定义字体/颜色和半透明背景?

如何在 HTML 5 中为音频、视频、css、图像创建预加载器?

可以在HTTP / 2上推送manifest.json吗?我应该如何为它脱毛?

Elasticsearch将数据预加载到文件系统缓存中

IOS:应用内通知+通知服务+内容扩展

如何删除 Flash 的预加载器?