iOS MDM有效负载托管应用配置,观察者无法正常工作

时间:2018-04-13 05:03:56

标签: ios swift xcode mdm

我可以从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有效负载托管应用配置进行更改时都会收到通知

我尝试在关键" 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")
            }
        }
    }

但是,当服务器更改托管应用程序配置时,回调方法即覆盖func observeValue .... 永远不会收到调用。

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

2 个答案:

答案 0 :(得分:2)

您应该使用NSUserDefaultsDidChangeNotification而不是KVO

答案 1 :(得分:0)

尽管答案是@ 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] {
       }
}