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] {
}
}
我可以从 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] {
}
}