HomeKit框架详细解析(五) —— 创建Homes并添加配件 Creating Homes and Adding Accessories

版本记录

版本号 时间
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中的配件

    1. 添加附件浏览代理协议,并将附件浏览属性添加到您的类接口。
@interface EditHomeViewController () 
 
@property HMAccessoryBrowser *accessoryBrowser;
 
@end

用你的类名替换EditHomeViewController

    1. 创建附件浏览对象,并设置其代理。
self.accessoryBrowser = [[HMAccessoryBrowser alloc] init];
self.accessoryBrowser.delegate = self;
    1. 开始寻找配件。
[self.accessoryBrowser startSearchingForNewAccessories];
    1. 添加找到的配件到您的收藏。
- (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:方法以从您的收藏或视图中删除不再是新的附件。

    1. 停止搜索配件。

如果视图控制器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可以添加到一个或多个区域。

HomeKit框架详细解析(五) —— 创建Homes并添加配件 Creating Homes and Adding Accessories_第1张图片

要创建一个区域,请使用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
    }
}];

后记

本篇已结束,后面更精彩~~~~

HomeKit框架详细解析(五) —— 创建Homes并添加配件 Creating Homes and Adding Accessories_第2张图片

你可能感兴趣的:(HomeKit框架详细解析(五) —— 创建Homes并添加配件 Creating Homes and Adding Accessories)