【问题标题】:iOS MDM payload managed app configuration, observer not workingiOS MDM 有效负载托管应用程序配置,观察者不工作
【发布时间】:2018-04-13 05:03:56
【问题描述】:

我可以从下面的 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")
            }
        }
    }

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

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

【问题讨论】:

  • 我有完全相同的问题,不希望在 NSUserDefaults 上设置通知,因为我的应用程序一直在写入,我只想知道托管字典中是否有 MDM 更改.你找到解决办法了吗?
  • @Plasma 我在下面为你写了答案

标签: ios swift xcode mdm


【解决方案1】:

你应该使用 NSUserDefaultsDidChangeNotification 而不是 KVO

【讨论】:

  • 但是,您还会收到其他 UserDefaults 更改通知。如果您只想获得由 MDM 发出的通知,这将不起作用。
  • 我很想听听更多关于为什么 KVO 不起作用以及如何防止对 UserDefaults 的任何更改导致通知被处理的详细信息。
【解决方案2】:

虽然@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] {
       }
}

【讨论】:

  • 感谢您的回复,我正在使用 Obj C,但希望我可以很容易地翻译它!看起来您保留了 MDM 字典的本地副本,然后在收到通知时与实际的 MDM 字典进行比较,以查看是否有任何键更改正确?
猜你喜欢
  • 2017-04-01
  • 2014-03-24
  • 1970-01-01
  • 2011-04-14
  • 2013-01-30
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
相关资源
最近更新 更多