版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.01.30 |
前言
目前全世界都在积极投入AI领域,我国的互联网公司也是积极在AI方面进行投入布局,比如BAT以及今日头条等互联网公司都有自己的AI实验室。这里面和AI相关的目前可见的比如说智能家居,比如小米就出一款智能音响,苹果公司在这方面也不甘落后,推出框架HomeKit,接下来几篇我们就一起看一下这个框架。感兴趣的可以参考上面几篇文章。
1. HomeKit框架详细解析(一) —— 基本概览
2. HomeKit框架详细解析(二) —— HomeKit介绍 Introduction to HomeKit
3. HomeKit框架详细解析(三) —— 启用HomeKit Enabling HomeKit
4. HomeKit框架详细解析(四) —— 获取Home的布局 Getting the Home Layout
Creating Homes and Adding Accessories - 创建Homes和添加附件
HomeKit对象存储在由多个应用程序通过HomeKit框架访问的共享HomeKit数据库中。 所有HomeKit方法调用写入记录是异步的并包含完成处理程序参数。 如果方法成功,您的应用程序应更新完成处理程序中的本地对象。 启动对HomeKit对象的更改的应用程序不会收到代理消息,该App只接收完成处理程序回调。
要观察由其他App启动的对HomeKit对象的更改,请阅读Observing HomeKit Database Changes。 有关可能传递给异步消息的完成处理程序的错误代码,请阅读HomeKit Constants Reference。
Rules for Naming Objects - 命名对象的规则
本文档中指出的HomeKit对象的名称(如home,room和zone对象)由Siri识别。 以下规则适用于设置HomeKit对象的名称:
- 名称在名称空间内必须是唯一的。
- 属于用户的家庭homes的名字在一个名字空间中。
- home对象及其包含的对象位于另一个名称空间中。
- 名称只能包含字母数字,空格和撇号字符。
- 名称必须以字母或数字字符开头和结尾。
- 在比较中忽略空格和撇号字符(例如,home1和home 1是相同的)。
- 名称不区分大小写。
要了解用户可以用来与Siri交互的语言,请阅读HomeKit User Interface Guidelines中的“Siri集成”。
Creating Homes - 创建Homes
要添加Home,请在HMHomeManager类中使用addHomeWithName:completionHandler:异步方法。 作为参数传递给此方法的家庭home名称必须是唯一的。 家Home里的名字被Siri认可。
[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。
Adding a Room to a Home - 给home添加room
要将房间添加到家庭,请使用addRoomWithName:completionHandler:异步方法。 作为参数传递给该方法的房间名称必须在家中是唯一的。 房间名称由Siri承认。
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
子句中,插入更新应用视图的代码。
Discovering Accessories - 发现配件
附件封装物理附件的状态,因此不能由用户创建。 要允许用户将新配件添加到家home中,请使用HMAccessoryBrowser对象来发现尚未与家庭关联的新配件。 HMAccessoryBrowser
对象在后台搜索附件,并使用代理在发现新附件时通知您的应用程序。 只有在startSearchingForNewAccessories方法被调用之后,并且在调用stopSearchingForNewAccessories方法之前,HMAccessoryBrowserDelegate消息才被发送给代理。
发现home中的配件
- 添加附件浏览代理协议,并将附件浏览属性添加到您的类接口。
@interface EditHomeViewController () <HMAccessoryBrowserDelegate>
@property HMAccessoryBrowser *accessoryBrowser;
@end
用你的类名替换EditHomeViewController
。
- 创建附件浏览对象,并设置其代理。
self.accessoryBrowser = [[HMAccessoryBrowser alloc] init];
self.accessoryBrowser.delegate = self;
- 开始寻找配件。
[self.accessoryBrowser startSearchingForNewAccessories];
- 添加找到的配件到您的收藏。
- (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:方法以从您的收藏或视图中删除不再是新的附件。
- 停止搜索配件。
如果视图控制器VC开始查找附件,请覆盖viewWillDisappear:停止查找附件。
- (void)viewWillDisappear:(BOOL)animated {
[self.accessoryBrowser stopSearchingForNewAccessories];
}
注意:要安全地在Wi-Fi网络上获得新的无线附件,以便HomeKit可以发现它,请阅读External Accessory Framework Reference。
Adding Accessories to Homes and Rooms - 在home和room中添加配件
配件属于一个家庭home,可以选择添加到家中的房间room。 要将附件添加到家庭,请使用addAccessory:completionHandler:异步方法。 作为参数传递给此方法的配件名称在家中必须是唯一的。 要将附件添加到家中的房间room,请使用assignAccessory:toRoom:completionHandler:异步方法。 附件的默认房间room是roomForEntireHome方法返回的房间。
// 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
}
}];
}
}
}];
配件有一个或多个服务,服务有制造商定义的特征。 要从附件获取服务和特征对象,请阅读Accessing Services and Characteristics。
Changing Names of Accessories - 更改配件的名字
要更改附件的名称,请使用updateName:completionHandler:异步方法。
[accessory updateName:@"Kid's Night Light" completionHandler:^(NSError *error) {
if (error) {
// Failed to change the name
} else {
// Successfully changed the name
}
}];
Adding Bridges to Homes and Rooms - 给房屋和房间添加桥梁
桥是一种特殊类型的附件,允许你与不用直接与HomeKit通信的附件进行通信。例如,桥接器可能是使用除HomeKit附件协议之外的通信协议的多个灯的集线器。要为家庭添加桥接器,请按照向家庭添加任何其他类型的附件的步骤进行操作,如Adding Accessories to Homes and Rooms中所述。当你添加一座桥到家,桥后面的配件也被添加到家中。根据Observing HomeKit Database Changes中所述的更改通知设计模式,家庭代理将不会收到网桥的home:didAddAccessory委托消息,但会为网桥后面的每个附件收到home:didAddAccessory:委托消息。以与家中任何其他配件相同的方式处理桥后的配件 - 例如,将它们添加到配置的配件列表中。
相反,当您将桥添加到room时,桥后面的附件不会自动添加到房间中,因为桥及其附件可能位于不同的房间中。
Creating Zones - 创建区域
区域HMZone是任意可选的room分组,例如楼上,楼下或卧室。 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
}
}];
向zone中添加room,使用addRoom:completionHandler:异步方法。
__block HMRoom *room = roomInHome;
[zone addRoom:room completionHandler:^(NSError *error) {
if (error) {
// Failed to add room to zone
} else {
// Successfully added room to zone
}
}];
后记
本篇已结束,后面更精彩~~~~