Homekit笔记(二)

(一)创建Home布局

1> 允许用户创建一个或多个Home布局,每个Home代表一个有网络设备的住所.
2> 用户拥有Home的数据并可通过自己的任何一台iOS设备进行访问。
3> 用户也可以和客户共享一个Home,但是客户的权限会有更多限制。
4> 被指定为primary home的home默认是Siri指令的对象,并且不能指定home。
5> 每个Home一般有多个room,并且每个room一般会有多个智能配件。
6> 在home中,每个房间是独立的room,并具有一个有意义的名字,例如“卧室”或者“厨房”,这些名字可以在Siri 命令中使用。
7> 一个accessory代表实际家庭中的自动化设备,例如车库开门器。
8> 一个sevice是accessory提供的?种实际服务,例如打开或者关闭车库,或者车库上的灯。
9> 如果你的app 缓存了home布局的信息,那么当其布局发声改变的时候,app就需要更新这些信息。
10> 使用HMHomeManager对象可以从HomeKit数据库获取HMHome和其他相关的对象
11> 本章描述的API获取对象后,你应该通过代理回调函数保持获取对象和HomeKit数据库同步,具体描述请参看“Observing HomeKit Database Changes

创建Home Manager 对象
使用HMHomeManager对象的访问home、room、配件、服务以及其他HomeKit对象。
在创建家庭对象管理器(home manager)之后,直接设置它的代理,以便获取到这些对象之后及时的通知到你。

 self.homeManager = [[HMHomeManager alloc] init];
 self.homeManager.delegate = self;

当你创建一个home manager对象时,HomeKit就开始从HomeKit数据库获取这些homes和相关对象,例如room和accessory对象。

当HomeKit正在获取那些对象时,home manager 的primaryHome属性是nil,并且homes属性是个空数组。

你的app应该处理用户还没有完成创建home的情况,但是app应该等待直到HomeKit完成初始化。当获取对象完成之后,HomeKit 会发送homeManagerDidUpdateHomes:消息给home manager的代理。

当app进入前台或者在后台Home manager属性发生改变时,这个homeManagerDidUpdateHomes:方法就会被调用,详情请参阅“Observing Changes to the Collection of Homes。

获取Primary Home和 Homes集合

获取 展示数据

  • (一) 通过home manager的primaryHome属性,可以得到primary home,代码如下:
HMHome *home = self.homeManager.primaryHome;
  • (二) 使用home manager的homes属性可以得到用户的所有home的集合;例如自家主要居所、度假别墅以及办公室。每个home都对应一个独立的home对象。
HMHome *home;
 for (home in self.homeManager.homes ){
  ... ...
}
  • (三) 获取 Home中的所有room, 在一个home中,rooms属性定义accessories的物理位置。用home的rooms属性可以枚举home中的所room。
HMHome *home = self.homeManager.primaryHome;
 HMRome *room;
 for(room in home.rooms){
  ...   ...
 }
  • (四) 获取Room 中的Accessories,Accessories 数组属于home,但是被指定给了home中的room。假如用户没有给一个accessory指定room,那么这个accessories被指定一个默认的room ,这个room是roomForEntireHome方法的返回值。用room的accessories属性可以枚举room中所有的accessory。代码如下:
HMAccessory *accessory;
 for(accessory in room.accessories){
  ... ...
 }

一旦你获取到一个accessory对象,你就可以访问它的服务和对象

  • (五) 获取Home中的Accessories属性
    使用HMHome类中的accessories的方法,可以直接从Home对象中获取所有的accessory对象,而不用枚举home中的所有room对象

创建Homes和添加Accessories

HomeKit对象被保存在一个可以共享的HomeKit数据库里,它可以通过HomeKit框架被多个应英程序访问。
所有HomeKit调用的方法都是异步写入的,并且这些方法都包含一个完成处理后的参数。如果这个方法处理成功了,你的应用将会在完成处理函数里更新本地对象。
应用程序启动时,HomeKit对象发生改变的并不能收到代理回调?法,只能接受处理完成后的回调函数。

  • (一) 创建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中增加一个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消息才被发送给代理对象。

1> 发现home中的配件,在你的类接口中添加配件浏览器委托协议,并且添加一个配件浏览器属性。代码如下:

@interface EditHomeViewController ()
@property HMAccessoryBrowser *accessoryBrowser;
@end

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发现的无线配件,请参阅External Accessory Framework Reference

  • (四) 为Home和room添加配件(Accessory)
    配件归属于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
                }
             }];
         } 
    }
}];

配件可提供一项或者多项服务,这些服务的特性是由制造商定义。想了解配件的服务和特性目的,请参阅 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交流。例如一个桥接口可以是控制多个灯的枢纽,它使用的是自己的通信协议,而不是HomeKit配件通信协议。想要给home添加多个桥接口 ,你可以按照Adding Accessories to Homes and Rooms中所描述的步骤,添加任何类型的配件到home中。
    正如Observing HomeKit Database Changes中所描述的那样,每次更改通知设计模,home的代理不会接收到桥接口的home:didAddAccessory: 代理消息,而是接收一个有关于配件的home:didAddAccessory:代理消息。
    在home中,要把桥接口后的配件和任何类型的配件看成一样的--例如,把它们加入配件列表的配置表中。相反的是,当你给room增添一个桥接口时,这个桥接口底层的配件并不会自动地添加到room中,原因是桥接口和它的的配件可以位于到不同的room中。

  • (七)创建分区
    分区 是任意可选的房间(rooms)分组;例如楼上、楼下或者卧室。房间可以被添加到一个或者多个区域。


    zone.png

    HMZone

可使用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
    }
 }];

观察HomeKit数据库的变化

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

推荐阅读更多精彩内容