HomeKit 允許用戶創(chuàng)建一個或者多個 Home 布局。每個 Home(HMHome)代表一個有網(wǎng)絡(luò)設(shè)備的住所。用戶擁有Home的數(shù)據(jù)并可通過自己的任何一臺 iOS 設(shè)備進行訪問。用戶也可以和客戶共享一個 Home,但是客戶的權(quán)限會有更多限制。被指定為 primary home 的 home 默認(rèn)是 Siri 指令的對象,并且不能指定 Home。
每個 Home 一般有多個 room,并且每個 room 一般會有多個智能配件。在 Home(HMHome) 中,每個房間是獨立的 room,并具有一個有意義的名字,例如“臥室”或者“廚房”,這些名字可以在 Siri 命令中使用。一個 accessory(HMAccessory)代表實際家庭中的自動化設(shè)備,例如車庫開門器。一個 sevice(HMService)是 accessory 提供的?種實際服務(wù),例如打開或者關(guān)閉車庫,或者車庫上的燈。
http://wiki.jikexueyuan.com/project/homekit/images/homekit3.png" alt="" />
如果你的 App 緩存了 Home 布局的信息,那么當(dāng)其布局發(fā)聲改變的時候,App 就需要更新這些信息。使用 HMHomeManager 對象可以從 HomeKit 數(shù)據(jù)庫獲取 HMHome 和其他相關(guān)的對象。本章描述的 API 獲取對象后,你應(yīng)該通過代理回調(diào)函數(shù)保持獲取對象和 HomeKit 數(shù)據(jù)庫同步,具體描述請參看“Observing HomeKit Database Changes"。
使用 Home Manager—一個 HMHomeManager 對象的訪問 home、room、配件、服務(wù)以及其他 HomeKit 對象。在創(chuàng)建家庭對象管理器(home manager)之后,直接設(shè)置它的代理,以便獲取到這些對象之后及時的通知到你。
self.homeManager = [[HMHomeManager alloc] init];
self.homeManager.delegate = self;
當(dāng)你創(chuàng)建一個 home manager 對象時,HomeKit 就開始從 HomeKit 數(shù)據(jù)庫獲取這些 homes 和相關(guān)對象,例如 room 和 accessory 對象。當(dāng) HomeKit 正在獲取那些對象時,home manager 的 primaryHome 屬性是 nil,并且 homes 屬性是個空數(shù)組。你的 App 應(yīng)該處理用戶還沒有完成創(chuàng)建 home 的情況,但是 App 應(yīng)該等待直到 HomeKit 完成初始化。當(dāng)獲取對象完成之后,HomeKit 會發(fā)送 homeManagerDidUpdateHomes:消息給 home manager 的代理。
注意:當(dāng) App 進入前臺或者在后臺 Home manager 屬性發(fā)生改變時,這個 homeManagerDidUpdateHomes:方法就會被調(diào)用,詳情請參閱“Observing Changes to the Collection of Homes”。
通過 home manager 的 primaryHome 屬性,可以得到 primary home,代碼如下:
HMHome *home = self.homeManager.primaryHome;
使用 home manager 的 homes 屬性可以得到用戶的所有 home 的集合;例如自家主要居所、度假別墅以及辦公室。每個 home 都對應(yīng)一個獨立的 home 對象。
HMHome *home;
for(home in self.homeManager.homes ){
…}
在一個 home 中,rooms 屬性定義 accessories 的物理位置。用 home 的 rooms 屬性可以枚舉 home 中的所 room。
HMHome *home = self.homeManager.primaryHome;
HMRome *room;
for(room in home.rooms){
…
}
Accessories 數(shù)組屬于 home,但是被指定給了 home 中的 room。假如用戶沒有給一個 accessory 指定 room,那么這個 accessories 被指定一個默認(rèn)的 room ,這個 room 是 roomForEntireHome 方法的返回值。用 room 的 accessories 屬性可以枚舉 room 中所有的 accessory。代碼如下:
HMAccessory *accessory;
for(accessory in room.accessories){
…
}
如果你要展示一個個 accessory 的相關(guān)信息或者允許用戶控制它,可設(shè)置 accessory 的代理方法并實現(xiàn)這個代理方法,詳情請見“Observing Changes to Accessories”。
一旦你獲取到一個 accessory 對象,你就可以訪問它的服務(wù)和對象,詳情請參閱“Accessing Services and Characteristics”。