HomeKit 對象被保存在一個可以共享的 HomeKit 數(shù)據(jù)庫里,它可以通過 HomeKit 框架被多個應(yīng)英程序訪問。所有 HomeKit 調(diào)用的方法都是異步寫入的,并且這些方法都包含一個完成處理后的參數(shù)。如果這個方法處理成功了,你的應(yīng)用將會在完成處理函數(shù)里更新本地對象。應(yīng)用程序啟動時,HomeKit 對象發(fā)生改變的并不能收到代理回調(diào)?法,只能接受處理完成后的回調(diào)函數(shù)。
想要觀察其他應(yīng)用程序啟動時 HomeKit 對象的變化,請參閱:Observing HomeKit Database Changes。查閱異步消息完成處理后傳過來的錯誤碼的信息,請參閱:HomeKit Constants Reference。
HomeKit 對象的名字,例如 home、room 和 zone 對象都可以被 Siri 識別,這一點已經(jīng)在文檔中指出。以下幾點是 HomeKit 對象的命名規(guī)則:
想了用戶可以使用哪些語言與 Siri 進行交互,請參閱HomeKit User Interface Guidelines文檔中的"Siri Integration"。
在 HMHomeManager 類中使用 addHomeWithName:completionHandler: 異步方法可以添加一個 home。作為參數(shù)傳到那個方法中的 home 的名字,必須是唯一獨特的,并且是 Siri 可以識別的 home 名字。
[self.homeManager addHomeWithName:@"My Home"
completionHandler:^(HMHome *home, NSError *error) {
if (error != nil) {
// Failed to add a home
} else {
// Successfully added a home
} }];
在 else 語句中,寫入代碼以更新你應(yīng)的程序的視圖。為了獲取 home manager 對象,請參閱Getting the Home Manager Object。
使用 addRoomWithName:completionHandler: 異步方法可以在一個 home 中添加一個 room 對象。作為參數(shù)傳到那個方法中的 room 的名字,必須是唯一獨特的,并且是 Siri 可識別的 room 名字。
NSString *roomName = @"Living Room";
[home addRoomWithName:roomName completionHandler:^(HMRoom
*room, NSError *error) {
if (error != nil) {
// Failed to add a room to a home
} else {
// Successfully added a room to a home
} }];
在 else 語句中,寫入代碼更新應(yīng)用程序的視圖。
Accessories 封裝了物理配件的狀態(tài),因此它不能被用戶創(chuàng)建。想要允許用戶給家添加新的配件,我們可以使 HMAccessoryBrowser 對象找到一個與 home 沒有關(guān)聯(lián)的配件。HMAccessoryBrower 對象在后臺搜尋配件,當它找到配件的時候,使用委托來通知你的應(yīng)用程序。只有在 startSearchingForNewAccessories 方法調(diào)用之后或者 stopSearchingForNewAccessories 方法調(diào)用之前,HMAccessoryBrowserDelegate 消息才被發(fā)送給代理對象。
1.在你的類接口中添加配件瀏覽器委托協(xié)議,并且添加一個配件瀏覽器屬性。代碼如下:
@interface EditHomeViewController ()
@property HMAccessoryBrowser *accessoryBrowser;
@end
用你自己的類名代替 EditHomeViewController
2.創(chuàng)建配件瀏覽器對象,并設(shè)置它的代理
self.accessoryBrowser = [[HMAccessoryBrowser alloc] init];
self.accessoryBrowser.delegate = self;
3.開始搜尋配件
[self.accessoryBrowser startSearchingForNewAccessories];
4.將找到的配件添加到你的收藏里
- (void)accessoryBrowser:(HMAccessoryBrowser *)browser
didFindNewAccessory:(HMAccessory *)accessory {
// Update the UI per the new accessory; for example,
reload a picker
view.
[self.accessoryPicker reloadAllComponents];
}
用你自己的代碼實現(xiàn)上面的 accessoryBrowser:didFindNewAccessory:方法。 當然也可以實現(xiàn) accessoryBrowser:didRemoveNewAccessory: 這個方法來移除配件,這個配件對你的視圖或者收藏來說不再是新的。
5.停止搜尋配件
如果一個視圖控制器正在開始搜尋配件,那么可以通過重寫 viewWillDisappear:方法來停止搜尋配件。代碼如下:
- (void)viewWillDisappear:(BOOL)animated {
[self.accessoryBrowser stopSearchingForNewAccessories];
}
注意: 在 WiFi 網(wǎng)絡(luò)環(huán)境下,為了安全地獲取新的并且能夠被 HomeKit 發(fā)現(xiàn)的無線配件,請參閱External Accessory Framework Reference。
配件歸屬于 home,并且它可以被隨意添加到 home 中的任意一個 room 中。使用 addAccessory:completionHandler:這個異步方法可以在 home 中添加配件。這個配件的名字作為一個參數(shù)傳遞到上述異步方法中,并且這個名字在配件所屬的 home 中必須是唯一的。使用 assignAccessory:toRoom:completionHandler: 這個異步方法可以給 home 中的 room 添加配件。配件默認的 room 是 roomForEntireHome 這個方法返回值 room。下面的代碼演示了如何給 home 和 room 添加配件:
// Add an accesory to a home and a room
// 1. Get the home and room objects for the completion
handlers.
__block HMHome *home = self.home;
__block HMRoom *room = roomInHome;
// 2. Add the accessory to the home
[home addAccessory:accessory completionHandler:^(NSError
*error) {
if (error) {
// Failed to add accessory to home
} else {
if (accessory.room != room) {
// 3. If successfully, add the accessory to
the room
[home assignAccessory:accessory toRoom:room
completionHandler:^(NSError *error) {
if (error) {
// Failed to add accessory to room
} }];
} }
}];
配件可提供一項或者多項服務(wù),這些服務(wù)的特性是由制造商定義。想了解配件的服務(wù)和特性目的,請參閱 Accessing Services and Characteristics。
使用 updateName:completionHandler: 異步方法可以改變配件的名稱,代碼如下:
[accessory updateName:@"Kid's Night Light"
completionHandler:^(NSError *error) {
if (error) {
// Failed to change the name
} else {
// Successfully changed the name
}
}];
橋接口是配件中的一個特殊對象,它允許你和其他配件交流,但是不允許你直接和 HomeKit 交流。例如一個橋接口可以是控制多個燈的樞紐,它使用的是自己的通信協(xié)議,而不是 HomeKit 配件通信協(xié)議。想要給home添加多個橋接口 ,你可以按照 Adding Accessories to Homes and Rooms 中所描述的步驟,添加任何類型的配件到 home 中。當你給 home 添加一個橋接口時,在橋接口底層的配件也會被添加到 home 中。正如 Observing HomeKit Database Changes 中所描述的那樣,每次更改通知設(shè)計模,home 的代理不會接收到橋接口的 home:didAddAccessory: 代理消息,而是接收一個有關(guān)于配件的 home:didAddAccessory:代理消息。在 home 中,要把橋接口后的配件和任何類型的配件看成一樣的--例如,把它們加入配件列表的配置表中。相反的是,當你給 room 增添一個橋接口時,這個橋接口底層的配件并不會自動地添加到 room 中,原因是橋接口和它的的配件可以位于到不同的 room 中。
分區(qū) (HMZone) 是任意可選的房間(rooms)分組;例如樓上、樓下或者臥室。房間可以被添加到一個或者多個區(qū)域。
http://wiki.jikexueyuan.com/project/homekit/images/homrkit4.png" alt="" />
可使用 addZoneWithName:completionHandler: 異步方法創(chuàng)建分區(qū)。所創(chuàng)建的作為參數(shù)傳遞到這個方法中分區(qū)的名稱,在 home 中必須是唯一的,并且應(yīng)該能被 Siri 識別。代碼如下:
__block HMHome *home = self.home;
NSString *zoneName = @"Upstairs";
[home addZoneWithName:zoneName completionHandler:^(HMZone
*zone, NSError *error)
{
if (error) {
// Failed to create zone
} else {
// Successfully created zone, now add the rooms
}
}];
可使用 addRoom:completionHandler:異步方法給分區(qū)添加一個 room,代碼如下:
__block HMRoom *room = roomInHome;
[zone addRoom:room completionHandler:^(NSError *error) {
if (error) {
// Failed to add room to zone
} else {
// Successfully added room to zone
} }];