Как сохранить push-уведомление в Realm, когда приложение убито / фон, используя swift - PullRequest
0 голосов
/ 13 июня 2019

Я использую фон, чтобы использовать FCM для отправки сообщений на устройство iOS, я хочу сохранить push-информацию (используя Realm).

Есть только два случая, которые могут быть успешно сохранены.

1.app работает

2.app убит / фон, и нажмите, чтобы подтолкнуть уведомления баннера Я надеюсь, что смогу отключить приложение / фон и сохранить его, не нажимая на уведомление о баннере.

Итак, я использовал следующий метод

  1. Добавление расширения службы уведомлений в проект
  2. Включить фоновую выборку / Удаленные уведомления
  3. Расширение службы проектов и уведомлений добавлено в группы приложений

Возникает следующий вопрос. Я использовал то же, что и AppDelegates в UNNotificationServiceExtension для хранения push-кода, но это не сработало. Я посмотрел на некоторую связанную информацию. Кажется, что поскольку Extension не может совместно использовать базу данных Realm, что мне следует сделать, чтобы позволить им совместно использовать данные?

Или моя проблема не в моем повествовании? Пожалуйста, есть опытные люди, чтобы направлять меня, большое спасибо, мой английский не очень хороший, если мой вопрос не ясен, пожалуйста, дайте мне знать.

Царство класса

class Order: Object {

    @objc dynamic var id = UUID().uuidString
    @objc dynamic var name = ""
    @objc dynamic var amount = ""
    @objc dynamic var createDate = Date()

    override static func primaryKey() -> String? {
        return "id"
    }
}
class RealmDao: NSObject {

    static let shared = RealmDao()
    private var realm: Realm!

    private override init() {

        self.realm = try! Realm()
    }

    func getRealmObject() -> Realm {
        return self.realm
    }
}

класс NotificationService (NotificationService.swift)

import UserNotifications
import UIKit
import RealmSwift
import Realm

class NotificationService: UNNotificationServiceExtension {

    //
    let realm = try! Realm()
    let order: Order = Order()
    //
    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)

        let message = request.content.userInfo
        print("userInfo: \(message)")
        guard
            let aps = message[AnyHashable("aps")] as? NSDictionary,
            let alert = aps["alert"] as? NSDictionary,
            let title = alert["body"] as? String,
            let body = alert["title"] as? String
            else {
                // handle any error here
                return
        }
        print("Title: \(title) \nBody:\(body)")

        order.name = title
        order.amount = body

        try! realm.write {
            realm.add(order)
        }       

        if let bestAttemptContent = bestAttemptContent {
            // Modify the notification content here...
            bestAttemptContent.body = "\(bestAttemptContent.body) [test]"

            contentHandler(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }

}

AppDelegates.swift Приложение работает Сохранить сообщения

let realm = try! Realm()
 let order: Order = Order()

   func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        let userInfo = notification.request.content.userInfo //
        print("userInfo: \(userInfo)")
        guard
        let aps = userInfo[AnyHashable("aps")] as? NSDictionary,
        let alert = aps["alert"] as? NSDictionary,
        let body = alert["body"] as? String,
        let title = alert["title"] as? String
        else {
            // handle any error here
            return
        }
        print("Title: \(title) \nBody:\(body)")
        order.name = title
        order.amount = body
        try! realm.write {
            realm.add(order)
        }
        completionHandler([.badge, .sound, .alert])
    }
...