我可以从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方法。
答案 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] {
}
}