iOS Расширенные уведомления от FCM на переднем плане с использованием расширения службы уведомлений - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь реализовать расширенные уведомления в нашем приложении 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"
    }
}

Может ли кто-нибудь направить меня или поделиться некоторыми статьями? Большое спасибо!

...