Как поделиться данными области в расширениях - PullRequest
0 голосов
/ 20 июня 2019

Я использую 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 путь, это то, что я пропустил, мне действительно нужна помощь, спасибо!

...