Как поделиться Realm с расширением? - PullRequest
0 голосов
/ 02 июля 2019

Мне нужно сохранить push-уведомление о fcm в Realm.Когда приложение работает AppDelegate обрабатывать push-уведомления.NotificationServiceExtension обрабатывать push-уведомления при закрытии приложения

Я назначил Realm путь AppDelegate и NotificationServiceExtension для общего расположения, но когда я читаю это местоположение, сообщение дескриптора сохраняется толькокогда срабатывает NotificationServiceExtension.

И иногда появляется такое сообщение об ошибке Exception: Realm accessed from the incorrect thread.

Пожалуйста, помогите мне, эта проблема беспокоит меня больше месяца!

NotificationServiceExtension Class

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) {
        print("EXoldpath\(try! Realm().configuration.fileURL!.path)")
        configRealm()
        print("EXnewpath\(try! Realm().configuration.fileURL!.path)")
        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 {
                return
        }
        print("Title: \(title) \nBody:\(body)")
        order.name = title
        order.amount = body
        try! realm.write {
            realm.add(order)
        }
        if let bestAttemptContent = bestAttemptContent {
            bestAttemptContent.body = "\(bestAttemptContent.body) [appkilled]"
            contentHandler(bestAttemptContent)
        }
    }
    override func serviceExtensionTimeWillExpire() {
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            contentHandler(bestAttemptContent)      
        }
    }
    private func configRealm() {
        let fileURL = FileManager.default
            .containerURL(forSecurityApplicationGroupIdentifier: "group.myapp")!
            .appendingPathComponent("default.realm")
        let config = Realm.Configuration(fileURL: fileURL)
        Realm.Configuration.defaultConfiguration = config
    }   
}

Handle push notification in AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
           configRealm()
}

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 {
            return
        }
        print("Title: \(title) \nBody:\(body)")
         print("\(try! Realm().configuration.fileURL!.path)")
         configRealm()
      print("oldpath\(try! Realm().configuration.fileURL!.path)")
        order.name = title
        order.amount = body
        try! realm.write {
            realm.add(order)
        }
        completionHandler([.badge, .sound, .alert])
    }
    private func configRealm() {
        let fileURL = FileManager.default
            .containerURL(forSecurityApplicationGroupIdentifier: "group.myapp")!
            .appendingPathComponent("default.realm")
        let config = Realm.Configuration(fileURL: fileURL)
        Realm.Configuration.defaultConfiguration = config
    }   

В моем тесте, когда я прокомментировал configRealm() в func userNotificationCenter и позволил таблице прочитать путь по умолчанию к Realmбыло много данных.Я обнаружил, что функция хранилища AppDelegate работает, но она не сохраняется в общем пути, а сохраняется в исходном старом пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...