Запуск КВО из Pu sh Расширение для приложения - PullRequest
3 голосов
/ 13 апреля 2020

Я пытаюсь реализовать KVO в основном приложении и наблюдать, когда значение изменяется расширением. Основное приложение открыто, когда получено pu sh, но в основном приложении нет триггера. Только когда я закрываю и открываю его, я вижу изменения.

Класс уведомлений:

class NotificationService: UNNotificationServiceExtension {

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)

    if let bestAttemptContent = bestAttemptContent {

        var user = (bestAttemptContent.userInfo["user"] as! String?)!
        let userDefaults = UserDefaults(suiteName: "group.com.test.apps")
        userDefaults!.set(user as String, forKey: "User")
        userDefaults!.synchronize()
        contentHandler(bestAttemptContent)
    }
}
}

Основной ViewController:

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

     let userDefaults = UserDefaults(suiteName: "group.com.test.apps")
    userDefaults!.addObserver(self, forKeyPath: "User", options: NSKeyValueObservingOptions.new, context: nil)

}

 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    //Not triggered
    let userDefaults = UserDefaults(suiteName: "group.com.test.apps")
    let user = userDefaults!.string(forKey: "User")
    NSLog("User \(user)")

}
}

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

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

Здесь исправлен контроллер на стороне приложения. Протестировано с Xcode 11.4 / iOS 13.4

Примечание: KVO работает, только если установлено действительно новое значение, поэтому, если в вашем добавочном номере вы установите равное значение в UserDefaults, наблюдатель не будет уведомлен .

class ViewController: UIViewController {

  // keep suite instance as member
  let userDefaults = UserDefaults(suiteName: "group.com.test.apps")

  override func viewDidLoad() {
    super.viewDidLoad()

    userDefaults!.addObserver(self, forKeyPath: "User", options: [.new], context: nil)
  }

  override func observeValue(forKeyPath keyPath: String?, of object: Any?, 
       change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    let user = userDefaults!.string(forKey: "User")
    NSLog("User \(user)")

  }
}
0 голосов
/ 15 апреля 2020

Вы на iOS 10 или позже? KVO между процессами (например, расширениями) не работал до 10. https://developer.apple.com/library/archive/releasenotes/Miscellaneous/RN-Foundation-OSX10.12/index.html, поиск «Наблюдение за ключами и NSUserDefaults»

...