Я пытаюсь реализовать расширенные уведомления в нашем приложении React Native, используя firebase. Богатые уведомления еще не поддерживаются в программе native native, поэтому мне пришлось использовать сочетание swift в моем NotificationServiceExtension и Objective C в моем AppDelegate.m. Я не опытный ни в одном из них. Расширенные уведомления правильно отображаются, если приложение находится в фоновом режиме или закрыто, но не отображаются, если приложение находится на переднем плане, даже если я всегда получаю их (используя точку останова). Странная часть в том, что иногда они делают ...
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
let title = request.content.title
let subtitle = request.content.subtitle
let body = request.content.body
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
guard let bestAttemptContent = bestAttemptContent,
let attachmentURLAsString = bestAttemptContent.userInfo["image"] as? String,
let attachmentURL = URL(string: attachmentURLAsString) else {
return
}
downloadImageFrom(url: attachmentURL, title: title, subtitle: subtitle, body: body) { (attachment) in
if let attachment = attachment {
bestAttemptContent.attachments = [attachment]
contentHandler(bestAttemptContent)
}
}
}
private func downloadImageFrom(url: URL, title: String, subtitle: String, body: String, with completionHandler: @escaping (UNNotificationAttachment?) -> Void) {
let task = URLSession.shared.downloadTask(with: url) { (downloadedUrl, response, error) in
guard let downloadedUrl = downloadedUrl else {
completionHandler(nil)
return
}
var urlPath = URL(fileURLWithPath: NSTemporaryDirectory())
let uniqueURLEnding = ProcessInfo.processInfo.globallyUniqueString + ".png"
urlPath = urlPath.appendingPathComponent(uniqueURLEnding)
try? FileManager.default.moveItem(at: downloadedUrl, to: urlPath)
let notificationContent = UNMutableNotificationContent()
notificationContent.title = title
notificationContent.subtitle = subtitle
notificationContent.body = body
notificationContent.sound = UNNotificationSound.default
notificationContent.badge = 0
do {
let attachment = try UNNotificationAttachment(identifier: "notifImg", url: urlPath, options: nil)
notificationContent.attachments = [attachment]
let request = UNNotificationRequest(identifier: "notif",
content: notificationContent,
trigger: nil)
UNUserNotificationCenter.current().add(request) { (error) in
completionHandler(attachment)
}
completionHandler(attachment)
} catch {
completionHandler(nil)
}
}
task.resume()
}
override func serviceExtensionTimeWillExpire() {
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
Я получил этот код из многих статей, которые я прочитал. Запрос на подтверждение уведомлений находится в AppDelegate.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
[application registerUserNotificationSettings:
[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert)
categories:nil]];
[application registerForRemoteNotifications];
...
}
Я отправляю уведомления, используя https://fcm.googleapis.com/fcm/send, например так:
{
"notification": {
"mutable_content": true,
"title": "title",
"body": "body"
},
"to" : "__token__",
"data": {
"image": "https://ilyarm.ru/assets/949163b5edd92aa1ec0379734-697x403.jpg"
}
}
Может ли кто-нибудь направить меня или поделиться некоторыми статьями? Большое спасибо!