HomeKit - Как обновить значение isReachable аксессуара, когда я возвращаюсь с фона на передний план?

Ситуация: я разрабатываю приложение, которое управляет аксессуарами HomeKit. Например, я делаю так:

  1. Аксессуар включен, и я вижу это через приложение. Также в режиме переднего плана метод HMAccessoryDelegate:

func accessoryDidUpdateReachability(HMAccessory)

работает нормально, и я могу обрабатывать статус моего аксессуара.

  1. Я переключаю приложение в фоновый режим.

  2. Я выключаю аксессуар (я имею в виду полное отключение питания), поэтому он должен быть недоступен.

  3. Я переключаю приложение в режим переднего плана, но аксессуар по-прежнему доступен. метод func accessoryDidUpdateReachability(HMAccessory) — не вызывается. значение accessory.isReachable не обновлено.

Пример кода, когда я выхожу на передний план:

func applicationDidBecomeActive(_ application: UIApplication) {  
    if let home = HomeStore.sharedStore.home {  
        for accessory in home.accessories {  
            print(accessory.isReachable) //not updated  
            for service in accessory.services {  
                for characteristic in service.characteristics {  
                    characteristic.readValue { (error) in //updated  
                        if error == nil {  
                            let notification = Notification(name: Notification.Name(rawValue: "UpdatedCharacteristic"))  
                            NotificationCenter.default.post(notification)  
                        }  
                    }  
                }  
            }  
        }  
    }  
}

Вопрос: как обновить значения isReachable для аксессуаров, когда я возвращаюсь из фонового режима на передний план?


person n3lab    schedule 21.11.2018    source источник


Ответы (1)


Вы можете создать функцию в ViewController, которая реализует HMHomeManagerDelegate:

func startHomeManager() {
    manager = HMHomeManager()
    manager.delegate = self

    // do something here
}

и добавьте вызов startHomeManager() в ваш viewDidLoad(). Это обновит ваш объект HMHome. Затем вызовите эту функцию в своем AppDelegate:

func applicationWillEnterForeground(_ application: UIApplication) {
    viewController.startHomeManager()
    viewController.didRestartHomeManager()
}

Бонусом является то, что вы можете вызвать startHomeManager() для обновления и т. д.

person Jim Marquardt    schedule 15.03.2019