Я использую Realm
в Eextension
и AppDelegate
Realm
в основном используется для хранения push-сообщений (используется FCM
)
AppDelegate
используется для хранения push-уведомлений, полученных во время запуска приложения.
NotificationServiceExtension
используется для хранения push-уведомлений после закрытия приложения.
Моя проблема в том, что я знаю, что Extension
должен указать Realm
на публичный путь, прежде чем его можно будет использовать совместно, поэтому я указываю Realm
на новый путь. Я использую тот же код в AppDelegate
, NotificationServiceExtension
и указываю им новый путь Realm
, но когда я это делаю, NotificationServiceExtension
может быть правильно сохранен в новом пути к области, AppDelegate
не может быть правильно сохранен в новый путь (он все еще сохраняется в исходный путь по умолчанию)
Царство класса
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() {
func getRealmObject() -> Realm {
return self.realm
}
}
AppDelegate обрабатывает часть push-уведомления
class AppDelegate: UIResponder, UIApplicationDelegate {
let realm = try! Realm()
let order: Order = Order()
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
configRealm()
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
configRealm()
print("fileURL:\(realm.configuration.fileURL!)")
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])
}
private func configRealm() {
let fileURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.myapp")!
.appendingPathComponent("Library/Caches/default.realm")
let config = Realm.Configuration(fileURL: fileURL)
Realm.Configuration.defaultConfiguration = config
}
NotificationServiceExtension сохраняет push-уведомление, когда приложение закрывается
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) {
configRealm()
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) [testmessage]"
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("Library/Caches/default.realm")
let config = Realm.Configuration(fileURL: fileURL)
Realm.Configuration.defaultConfiguration = config
}
После моего теста, если приложение будет убито в 10:00, оно будет успешно сохранено. Когда приложение работает, когда оно получает уведомление в 10:01, оно не будет успешно сохранено, но когда я добавлю configRealm()
в AppDelegate
Функция отменяется, так что моя таблица отображает данные Realm
исходный путь по умолчанию. Отображается уведомление только за 10:01, и уведомление, полученное в 10:00, исчезает, что доказывает, что мой AppDelegate
не смог успешно указать новый путь. Realm
путь, это то, что я пропустил, мне действительно нужна помощь, спасибо!