HomeKit 允許用戶創建一個或者多個Home布局。每個Home([HMHome](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHome_Class/index.html#//apple_ref/occ/cl/HMHome))代表一個有網絡設備的住所。用戶擁有Home的數據并可通過自己的任何一臺iOS設備進行訪問。用戶也可以和客戶共享一個Home,但是客戶的權限會有更多限制。被指定為primary home的home默認是Siri指令的對象,并且不能指定home。
每個Home一般有多個room,并且每個room一般會有多個智能配件。在home([HMHome](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMRoom_Class/index.html#//apple_ref/occ/cl/HMRoom))?中,每個房間是獨立的room,并具有一個有意義的名字,例如“臥室”或者“廚房”,這些名字可以在Siri 命令中使用。一個accessory([HMAccessory](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMAccessory_Class/index.html#//apple_ref/occ/cl/HMAccessory))代表實際家庭中的自動化設備,例如車庫開門器。一個sevice([HMService](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMService_Class/index.html#//apple_ref/occ/cl/HMService))是accessory提供的?種實際服務,例如打開或者關閉車庫,或者車庫上的燈。

如果你的app 緩存了home布局的信息,那么當其布局發聲改變的時候,app就需要更新這些信息。使用[HMHomeManager](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHomeManager_Class/index.html#//apple_ref/occ/cl/HMHomeManager)對象可以從HomeKit數據庫獲取[HMHome](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHome_Class/index.html#//apple_ref/occ/cl/HMHome)和其他相關的對象。本章描述的API獲取對象后,你應該通過代理回調函數保持獲取對象和HomeKit數據庫同步,具體描述請參看“[Observing HomeKit Database Changes](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/HomeKitDeveloperGuide/RespondingtoHomeKitDatabaseChanges/RespondingtoHomeKitDatabaseChanges.html#//apple_ref/doc/uid/TP40015050-CH5-SW2)".
**創建 Home Manager對象**
使用Home Manager—一個[HMHomeManager](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHomeManager_Class/index.html#//apple_ref/occ/cl/HMHomeManager)對象的訪問home、room、配件、服務以及其他HomeKit對象。在創建家庭對象管理器(home manager)之后,直接設置它的代理,以便獲取到這些對象之后及時的通知到你。
~~~
self.homeManager?=?[[HMHomeManager?alloc]?init];
self.homeManager.delegate?=?self;
~~~
當你創建一個home manager對象時,HomeKit就開始從HomeKit數據庫獲取這些homes和相關對象,例如room和accessory對象。當HomeKit正在獲取那些對象時,home manager 的[primaryHome](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHomeManager_Class/index.html#//apple_ref/occ/instp/HMHomeManager/primaryHome)屬性是nil,并且[homes](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHomeManager_Class/index.html#//apple_ref/occ/instp/HMHomeManager/homes)屬性是個空數組。你的app應該處理用戶還沒有完成創建home的情況,但是app應該等待直到HomeKit完成初始化。當獲取對象完成之后,HomeKit 會發送[homeManagerDidUpdateHomes:](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHomeManagerDelegate_Protocol/index.html#//apple_ref/occ/intfm/HMHomeManagerDelegate/homeManagerDidUpdateHomes:)消息給home manager的代理。
注意:當app進入前臺或者在后臺Home manager屬性發生改變時,這個[homeManagerDidUpdateHomes:](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHomeManagerDelegate_Protocol/index.html#//apple_ref/occ/intfm/HMHomeManagerDelegate/homeManagerDidUpdateHomes:)方法就會被調用,詳情請參閱“[Observing Changes to the Collection of Homes](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/HomeKitDeveloperGuide/RespondingtoHomeKitDatabaseChanges/RespondingtoHomeKitDatabaseChanges.html#//apple_ref/doc/uid/TP40015050-CH5-SW3)”。
**獲取Primary Home和 Homes集合**
通過home manager的[primaryHome](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHomeManager_Class/index.html#//apple_ref/occ/instp/HMHomeManager/primaryHome)屬性,可以得到primary home,代碼如下:
~~~
HMHome?*home?=?self.homeManager.primaryHome;
~~~
使用home manager的[homes](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHomeManager_Class/index.html#//apple_ref/occ/instp/HMHomeManager/homes)屬性可以得到用戶的所有home的集合;例如自家主要居所、度假別墅以及辦公室。每個home都對應一個獨立的home對象。
~~~
HMHome?*home;
for(home?in?self.homeManager.homes?){
…}
~~~
**獲取 Home中的所有room**
在一個home中,rooms屬性定義accessories的物理位置。用home的[rooms](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHome_Class/index.html#//apple_ref/occ/instp/HMHome/rooms)屬性可以枚舉home中的所room。
~~~
HMHome?*home?=?self.homeManager.primaryHome;
HMRome?*room;
for(room?in?home.rooms){
…
}
~~~
**獲取Room 中的Accessories**
Accessories 數組屬于home,但是被指定給了home中的room。假如用戶沒有給一個accessory指定room,那么這個accessories被指定一個默認的room ,這個room是[roomForEntireHome](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHome_Class/index.html#//apple_ref/occ/instm/HMHome/roomForEntireHome)方法的返回值。用room的[accessories](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMRoom_Class/index.html#//apple_ref/occ/instp/HMRoom/accessories)屬性可以枚舉room中所有的accessory。代碼如下:
~~~
HMAccessory?*accessory;
for(accessory?in?room.accessories){
…
}
~~~
如果你要展示一個個accessory的相關信息或者允許用戶控制它,可設置accessory的代理方法并實現這個代理方法,詳情請見“[Observing Changes to Accessories](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/HomeKitDeveloperGuide/RespondingtoHomeKitDatabaseChanges/RespondingtoHomeKitDatabaseChanges.html#//apple_ref/doc/uid/TP40015050-CH5-SW1)”.
一旦你獲取到一個accessory對象,你就可以訪問它的服務和對象,詳情請參閱“[Accessing Services and Characteristics](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/HomeKitDeveloperGuide/AccessingServicesandTheirCharacteristics/AccessingServicesandTheirCharacteristics.html#//apple_ref/doc/uid/TP40015050-CH6-SW1)”。
**獲取Home中的Accessories屬性**
使用[HMHome](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHome_Class/index.html#//apple_ref/occ/cl/HMHome)類中的[accessories](https://developer.apple.com/library/ios/documentation/HomeKit/Reference/HMHome_Class/index.html#//apple_ref/occ/instp/HMHome/accessories)的方法,可以直接從Home對象中獲取所有的accessory對象,而不用枚舉home中的所有room對象(詳情請見“[Getting the Accessories in a Room](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/HomeKitDeveloperGuide/FindingandAddingAccessories/FindingandAddingAccessories.html#//apple_ref/doc/uid/TP40015050-CH3-SW5)”。