iOS MDM 负载管理的应用程序配置,观察者不工作

iOS MDM payload managed app configuration, observer not working

我可以从 MDM 负载管理的应用程序配置中读取下面是要读取的代码

func getManagedAppServerUrl() -> String? {
        if let managedConf = UserDefaults.standard.object(forKey: "com.apple.configuration.managed") as? [String:Any] {
            if let serverURL = managedConf["server_url"] as? String{
                return serverURL
            }
        }
        return nil
    }

以上代码按预期工作。

我希望在 MDM 服务器对 "MDM payload managed app configuration"

进行更改时收到通知

我尝试在键 "com.apple.configuration.managed" 上添加 Userdefault 观察者 添加观察者的代码如下

UserDefaults.standard.addObserver(self, forKeyPath: "com.apple.configuration.managed", options: NSKeyValueObservingOptions.new, context: nil)

回调方法,一旦发生变化就会被调用

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {//key value of mdm configraion change detection
        if let keyPathChangeDetect = keyPath {
            if keyPathChangeDetect == "com.apple.configuration.managed" {
                print("configuration change detected")
            }
        }
    }

但是回调方法,即 override func observeValue.... 在服务器对托管应用程序配置进行更改时永远不会调用。

即使应用程序使用计时器进行更改并更改 "com.apple.configuration.managed" Userdefault 值也不会撤销 observeValue 方法。

你应该使用 NSUserDefaultsDidChangeNotification 而不是 KVO

虽然@mkowal87给出的答案是为我工作的,但我在这里写的很详细

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    NotificationCenter.default.addObserver(self,selector: #selector(mdmConfigChange),name: UserDefaults.didChangeNotification,object: nil)
}

由于上面的观察者方法会在 MDM 配置文件更改配置时被调用多次,所以我使用了一些标志(保存的用户默认值)来检查配置是否确实发生了变化。

@objc func mdmConfigChange() -> Void {
       if let managedConf = UserDefaults.standard.object(forKey: com.apple.configuration.managed) as? [String:Any] {
       }
}