監控 iOS 裝置狀態

在 iOS 適用的 Home API 中,您可以使用 Swift 的 Combine 架構,觀察住家狀態的變化。如要透過 Home API 觀察結構、房間、裝置中繼資料和裝置狀態的變化,可以使用任何 API 搭配 HomeDevice。方法是訂閱發布商,從非同步事件公開值。

當集合中的任何項目新增、刪除或修改時,系統會傳回集合的最新快照。

開發人員必須比較這個快照與舊副本,才能推斷具體變更。您可以使用 id 欄位,為 Home API 中的每個父項物件類型設定這個用途。

如何取消包裝選用物件

如果物件為選用,請使用 if letguard 安全地解除包裝物件。請勿使用 !,因為除非開發人員確定物件不得為空值,否則絕不應使用 !

範例中的輸入參數 structureID 定義為 String?,表示這是選用字串,且可能為空值。這個函式會根據 structureID 中的輸入內容,找出 Structure 物件。

建議您按照下列方式處理選用物件:

func structure(structureID: String?) -> Structure? {
    guard let structureID else { return nil }
    return structures.first { $0.id == structureID }
  }

如何使用發布商

以下是使用 Home API 處理發布者的基本範例。在下列範例中,必須建立 Home 的執行個體。

var home: Home?

存取集合前,請務必先解除包裝,因為集合是選用項目:

guard let home else { return nil }

追蹤結構的變更

結構發生下列變更時,系統會觸發這項集合:

home.structures().batched()
  .compactMap { $0.first(where: { $0.id = myStructureID} }
  .removeDuplicates()
  .sink { structure in
    if let structure = structure {
      print("Structure \(structure.id) updated to \(structure.name)")
    }
  }

追蹤特定裝置的變更

裝置發生下列變更時,系統會觸發收集作業:

home.devices().batched()
  .compactMap { deviceList -> HomeDevice? in
    deviceList.filter { $0.name == "Bedroom Lamp"}.first
  }
  .removeDuplicates()
  .sink { lampDevice in
    if lampDevice != nil {
      print("The bedroom lamp has changed!")
    }
  }

追蹤裝置上特定特徵的變更

使用裝置和 Google Home API 支援的任何特徵。如需完整清單,請參閱 Trait

device.types.subscribe(OnOffLightDeviceType.self)
  .compactMap { $0.matterTraits.onOffTrait }
  .removeDuplicates()
  .sink { onOffState in
    if let onOffState = onOffState {
      print("Got new state update: \(onOffState.onOff)")
    }
  }

追蹤裝置上特定類型的變更

裝置類型發生下列變更時,系統會觸發這項收集作業:

使用 Home API 支援的任何 Matter 裝置類型。如需完整清單,請參閱DeviceType

device.types.subscribe(DimmableLightDeviceType.self)
  .compactMap { $0.matterTraits.levelControlTrait }
  .removeDuplicates()
  .sink { dimmableLightDevice in
    if let dimmableLightDevice = dimmableLightDevice
      print("Got new state update! \(levelControlTrait.currentLevel)")
    }
  }

追蹤結構中聊天室的變更

如果會議室發生下列變更,系統就會觸發這項收集作業:

如要追蹤裝置新增至房間或從房間移除的時間,請使用devices()查詢

home.rooms().batched()
  .sink { rooms in
    print("Got a new updated set of rooms!")
    for room in rooms {
      print("Got room #\(room.name)")
    }
  }

訂閱活動

在 Home API 中,事件用於偵測裝置狀態的變化。

self.cancellable = self.device.types.subscribe(FanDeviceType.self)
  .receive(on: DispatchQueue.main)
  .catch { error in
    Logger.error("Error getting FanDeviceType: \(error)")
    return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
  }
  .sink { [weak self] fanDeviceType in
    self?.fanDeviceType = fanDeviceType
    self?.updateTileInfo()
  }
}