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 () <HMAccessoryBrowserDelegate>
 
@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可以添加到一个或多个区域。

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

后记

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容