Мне нужно сохранить 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 работает, но она не сохраняется в общем пути, а сохраняется в исходном старом пути.