根据文档,我添加了NotificationExtension。这是代码
import UserNotifications
import Firebase
import FirebaseMessaging
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 = "\(bestAttemptContent.title) [modified]"
//contentHandler(bestAttemptContent)
}
Messaging.serviceExtension().populateNotificationContent(self.bestAttemptContent!, withContentHandler: contentHandler)
}
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)
}
}
}
firebase控制台显示图像
[![在此处输入图片描述] [1]] [1]
但是在调试过程中,Receive从不调用,接收到的通知也没有图像,即使我在iPhone设置中将通知设置为持久。
要解决此问题需要做什么?如何查看NotificationService是否已正确连接到我的应用程序
[
AnyHashable("google.c.a.ts"): 1575541521, AnyHashable("aps"): {
alert = {
body = "Test for imge";
title = Test;
};
"mutable-content" = 1;
sound = default;
}, AnyHashable("google.c.a.e"): 1, AnyHashable("google.c.a.c_l"): Data, AnyHashable("fcm_options"): {
image = "https://thevowapp.com/iphoneapp/peri/media/portstar.png";
}, AnyHashable("gcm.notification.sound2"): default, AnyHashable("google.c.a.udt"): 0, AnyHashable("gcm.n.e"): 1, AnyHashable("gcm.message_id"): 1575541521949602, AnyHashable("google.c.a.c_id"): 5702933232519496714]
也向扩展程序添加了通知,但我看不到任何后台模式atm,因为不需要代码,所以不需要它们。调试器仍然不会滚动。
答案 0 :(得分:1)
首先,您的通知有效载荷应在mutable-content
内包含参数aps
。
此参数很重要。
如果
aps
内不存在,则不会调用NotificationService,也不会在通知的右侧获得图像。
摘自文档here:
mutable-content:整数
通知服务应用扩展标记。如果值为1,则系统会在递送前将通知传递给您的Notification Service应用扩展程序。使用您的扩展程序来修改通知的内容。
第二,您需要在您的notificationService中下载图像并将其附加到通知中。
您可以使用以下示例作为起点。这取决于您如何在有效负载内发送图像链接。如果您要发布您的实际有效载荷,那么我可以编辑我的帖子。
import UserNotifications
import Foundation
import SwiftyJSON
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 {
let apsData = request.content.userInfo["aps"] as! [String : Any]
let alertData = apsData["alert"] as! [String : Any]
let imageData = request.content.userInfo["fcm_options"] as! [String : Any]
bestAttemptContent.title = (alertData["title"] as? String) ?? ""
bestAttemptContent.body = (alertData["body"] as? String) ?? ""
guard let urlImageString = imageData["image"] as? String else {
contentHandler(bestAttemptContent)
return
}
if let newsImageUrl = URL(string: urlImageString) {
guard let imageData = try? Data(contentsOf: newsImageUrl) else {
contentHandler(bestAttemptContent)
return
}
guard let attachment = UNNotificationAttachment.saveImageToDisk(fileIdentifier: "newsImage.jpg", data: imageData, options: nil) else {
contentHandler(bestAttemptContent)
return
}
bestAttemptContent.attachments = [ attachment ]
}
Messaging.serviceExtension().populateNotificationContent(self.bestAttemptContent!, withContentHandler: contentHandler)
}
}
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)
}
}
}
//MARK: Extension for Notification Attachment
extension UNNotificationAttachment {
static func saveImageToDisk(fileIdentifier: String, data: Data, options: [NSObject : AnyObject]?) -> UNNotificationAttachment? {
let fileManager = FileManager.default
let folderName = ProcessInfo.processInfo.globallyUniqueString
let folderURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(folderName, isDirectory: true)
do {
try fileManager.createDirectory(at: folderURL!, withIntermediateDirectories: true, attributes: nil)
let fileURL = folderURL?.appendingPathComponent(fileIdentifier)
try data.write(to: fileURL!, options: [])
let attachment = try UNNotificationAttachment(identifier: fileIdentifier, url: fileURL!, options: options)
return attachment
} catch let error {
print("error \(error)")
}
return nil
}
}