创建 Homes 和添加 Accessories
编辑教程创建 Homes 和添加 Accessories
HomeKit 对象被保存在一个可以共享的 HomeKit 数据库里,它可以通过 HomeKit 框架被多个应英程序访问。
所有 HomeKit 调用的方法都是异步写入的,并且这些方法都包含一个完成处理后的参数。
如果这个方法处理成功了,你的应用将会在完成处理函数里更新本地对象。应用程序启动时,HomeKit 对象发生改变的并不能收到代理回调?法,只能接受处理完成后的回调函数。
对象命名规则
HomeKit 对象的名字,例如 home、room 和 zone 对象都可以被 Siri 识别,这一点已经在文档中指出。以下几点是 HomeKit 对象的命名规则:
对象名字在其命名空间内必须是唯一的。 | |
---|---|
属于用户所有的 home 名字都在一个命名空间内。 | |
一个 home 对象及其所包含的对象在另一个命名空间内。 | |
名字只能包含数字、字母、空格以及省略号字符。 | |
名字必须以数字或者字母字符开始。 | |
在名字比较的时候,空格或者省略号是忽略的(例如 home1 和 home 1 同一个名字)。 | |
名字没有大小写之分。 |
创建 Homes
在 HMHomeManager 类中使用 addHomeWithName:completionHandler: 异步方法可以添加一个 home。作为参数传到那个方法中的 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 语句中,写入代码以更新你应的程序的视图。为了获取 home manager 对象,请参阅Getting the Home Manager Object。
在 Home 中增加一个 Room
使用 addRoomWithName:completionHandler: 异步方法可以在一个 home 中添加一个 room 对象。作为参数传到那个方法中的 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 语句中,写入代码更新应用程序的视图。
发现配件
Accessories 封装了物理配件的状态,因此它不能被用户创建。想要允许用户给家添加新的配件,我们可以使 HMAccessoryBrowser 对象找到一个与 home 没有关联的配件。HMAccessoryBrower 对象在后台搜寻配件,当它找到配件的时候,使用委托来通知你的应用程序。只有在 startSearchingForNewAccessories 方法调用之后或者 stopSearchingForNewAccessories 方法调用之前,HMAccessoryBrowserDelegate 消息才被发送给代理对象。
发现 home 中的配件
1.在你的类接口中添加配件浏览器委托协议,并且添加一个配件浏览器属性。代码如下:
@interface EditHomeViewController ()
@property HMAccessoryBrowser *accessoryBrowser;
@end
用你自己的类名代替 EditHomeViewController
2.创建配件浏览器对象,并设置它的代理
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];
}
用你自己的代码实现上面的 accessoryBrowser:didFindNewAccessory:方法。 当然也可以实现 accessoryBrowser:didRemoveNewAccessory: 这个方法来移除配件,这个配件对你的视图或者收藏来说不再是新的。
5.停止搜寻配件
如果一个视图控制器正在开始搜寻配件,那么可以通过重写 viewWillDisappear:方法来停止搜寻配件。代码如下:
- (void)viewWillDisappear:(BOOL)animated {
[self.accessoryBrowser stopSearchingForNewAccessories];
}
注意: 在 WiFi 网络环境下,为了安全地获取新的并且能够被 HomeKit 发现的无线配件
为 Home 和 room 添加配件
配件归属于 home,并且它可以被随意添加到 home 中的任意一个 room 中。
使用 addAccessory:completionHandler:这个异步方法可以在 home 中添加配件。
这个配件的名字作为一个参数传递到上述异步方法中,并且这个名字在配件所属的 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
} }];
} }
}];
配件可提供一项或者多项服务,这些服务的特性是由制造商定义。
更改配件名称
使用 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 交流。
例如一个桥接口可以是控制多个灯的枢纽,它使用的是自己的通信协议,而不是 HomeKit 配件通信协议。
想要给home添加多个桥接口 ,你可以按照 Adding Accessories to Homes and Rooms 中所描述的步骤,添加任何类型的配件到 home 中。
当你给 home 添加一个桥接口时,在桥接口底层的配件也会被添加到 home 中。正如 Observing HomeKit Database Changes 中所描述的那样,每次更改通知设计模,home 的代理不会接收到桥接口的 home:didAddAccessory: 代理消息,而是接收一个有关于配件的 home:didAddAccessory:代理消息。
在 home 中,要把桥接口后的配件和任何类型的配件看成一样的--例如,把它们加入配件列表的配置表中。
相反的是,当你给 room 增添一个桥接口时,这个桥接口底层的配件并不会自动地添加到 room 中,原因是桥接口和它的的配件可以位于到不同的 room 中。
创建分区
分区 (HMZone) 是任意可选的房间(rooms)分组;例如楼上、楼下或者卧室。房间可以被添加到一个或者多个区域。
可使用 addZoneWithName:completionHandler: 异步方法创建分区。所创建的作为参数传递到这个方法中分区的名称,在 home 中必须是唯一的,并且应该能被 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:异步方法给分区添加一个 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
} }];
选择支付方式:
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间