UNNotificationServiceExtension 不适用于 Firebase 云功能
Posted
技术标签:
【中文标题】UNNotificationServiceExtension 不适用于 Firebase 云功能【英文标题】:UNNotificationServiceExtension does't work with Firebase Cloud Functions 【发布时间】:2017-05-16 08:26:39 【问题描述】:我将UNNotificationServiceExtension
集成到应用程序中,但我没有图像等附加内容。我还认为我没有正确实现图片的加载,因此我尝试更改名称和正文有效负载以进行测试。但它没有给我任何结果。我通过 Firebase 控制台和 Firebase 云功能实现推送通知。我还阅读了有关此主题的几篇文章,但它们对我没有帮助。请告诉我如何解决?
class NotificationService: UNNotificationServiceExtension
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent
// Modify the notification content here...
bestAttemptContent.title = "Apple [modified]"
bestAttemptContent.body = "Xcode"
let attachmentStorage = AttachmentStorage()
if let jpeg = request.content.userInfo["image"] as? String
guard let url = URL(string: jpeg) else
contentHandler(bestAttemptContent)
return
debugPrint("url", url)
attachmentStorage.store(url: url, extension: "jpeg") (path, error) in
if let path = path
do
let attachment = try UNNotificationAttachment(identifier: "image", url: path, options: nil)
bestAttemptContent.attachments = [attachment]
contentHandler(bestAttemptContent)
return
catch
contentHandler(bestAttemptContent)
return
if let png = request.content.userInfo["png"] as? String
guard let url = URL(string: png) else
contentHandler(bestAttemptContent)
return
attachmentStorage.store(url: url, extension: "png") (path, error) in
if let path = path
do
let attachment = try UNNotificationAttachment(identifier: "image", url: path, options: nil)
bestAttemptContent.attachments = [attachment]
contentHandler(bestAttemptContent)
return
catch
contentHandler(bestAttemptContent)
return
contentHandler(bestAttemptContent)
override func serviceExtensionTimeWillExpire()
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent
contentHandler(bestAttemptContent)
class AttachmentStorage
func store(url: URL, extension: String, completion: ((URL?, Error?) -> ())?)
// obtain path to temporary file
let filename = ProcessInfo.processInfo.globallyUniqueString
let path = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(filename).\(`extension`)")
// fetch attachment
let task = URLSession.shared.dataTask(with: url) (data, response, error) in
let _ = try! data?.write(to: path)
completion?(path, error)
task.resume()
来自云函数的负载
const payload =
notification:
title: 'It’s decision time!',
body: 'text'
sound: 'default',
mutable_content: true
,
data:
image: "https://example.com/static_logos/320x320.png"
;
更新:我也读过这个issue
【问题讨论】:
【参考方案1】:我修好了。
我将mutable_content
发送为true
。但奇怪的是,Firebase 工程师期待的是一个 String 即 "true"
而不是
const payload =
notification:
title: 'It’s decision time!',
body: "text"
sound: 'default',
mutable_content: 'true'
,
data:
image: "example"
;
【讨论】:
以上是关于UNNotificationServiceExtension 不适用于 Firebase 云功能的主要内容,如果未能解决你的问题,请参考以下文章