鍍金池/ 教程/ iOS/ 創(chuàng)建 Homes 和添加 Accessories
簡介
觀察 HomeKit 數(shù)據(jù)庫的變化
測試 HomeKitApp
創(chuàng)建 Homes 和添加 Accessories
創(chuàng)建 Home 布局
創(chuàng)建動作集和觸發(fā)器
訪問服務(wù)和特性
啟用 HomeKit
用戶管理

創(chuàng)建 Homes 和添加 Accessories

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。

對象命名規(guī)則

HomeKit 對象的名字,例如 home、room 和 zone 對象都可以被 Siri 識別,這一點已經(jīng)在文檔中指出。以下幾點是 HomeKit 對象的命名規(guī)則:

  • 對象名字在其命名空間內(nèi)必須是唯一的。
  • 屬于用戶所有的 home 名字都在一個命名空間內(nèi)。
  • 一個 home 對象及其所包含的對象在另一個命名空間內(nèi)。
  • 名字只能包含數(shù)字、字母、空格以及省略號字符。
  • 名字必須以數(shù)字或者字母字符開始。
  • 在名字比較的時候,空格或者省略號是忽略的(例如 home1 和 home 1 同一個名字)。
  • 名字沒有大小寫之分。

想了用戶可以使用哪些語言與 Siri 進行交互,請參閱HomeKit User Interface Guidelines文檔中的"Siri Integration"。

創(chuàng)建 Homes

在 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。

在 Home 中增加一個 Room

使用 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)用程序的視圖。

發(fā)現(xiàn)配件

Accessories 封裝了物理配件的狀態(tài),因此它不能被用戶創(chuàng)建。想要允許用戶給家添加新的配件,我們可以使 HMAccessoryBrowser 對象找到一個與 home 沒有關(guān)聯(lián)的配件。HMAccessoryBrower 對象在后臺搜尋配件,當它找到配件的時候,使用委托來通知你的應(yīng)用程序。只有在 startSearchingForNewAccessories 方法調(diào)用之后或者 stopSearchingForNewAccessories 方法調(diào)用之前,HMAccessoryBrowserDelegate 消息才被發(fā)送給代理對象。

發(fā)現(xiàn) home 中的配件

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 和 room 添加配件

配件歸屬于 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
}
}];

為 Homes 和 Room 添加 Bridge(橋接口)

橋接口是配件中的一個特殊對象,它允許你和其他配件交流,但是不允許你直接和 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 中。

創(chuàng)建分區(qū)

分區(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
} }];