上一篇文章我们只是介绍了如何获取添加移除home和room对象,这篇继续往下走。还需要说的一点就是,我们所添加或者移除的这些homeKit对象都是会保存在一个共享的homeKit数据库中的。可以被多个应用程序通过homeKit框架访问,我们在自己写的homeKitAPP中添加和移除的home,room等homekit对象,在系统自带的家庭APP中的数据都是同步的。
获取room中的智能硬件对象(已经添加的)
获取到了room之后,当然是要获取其中的智能设备对象了。那么如何获取Room 中的Accessories呢?
Accessories 数组属于home,但是被指定给了home中不同的room。假如用户没有给一个accessory指定room,那么这个accessories被指定一个默认的room ,这个room是roomForEntireHome方法的返回值。用room的accessories属性可以枚举room中所有的accessory。这个是官方文档中的描述。
我大白话来一遍:比如说我的home中有一个智能灯泡,一个智能冰箱,一个智能热水器,一个智能电视。我把灯泡指定给了卧室这个room,冰箱指定给了厨房这个room,热水器指定给了卫生间room。电视没有指定room,那么就默认给它指定了一个room,这个room就是 HMRoom *defultRoom = [home roomForEntireHome]。当我需要获取到我的智能硬件对象的时候,我通过home.accessories获取到的是我家的所有智能硬件,也就是灯泡,冰箱和洗衣机以及电视。如果room是卧室,我通过room.accessories获得到的就是灯泡(我这里就举一个例子,卧室也可以有多个硬件),如果room是厨房,我通过room.accessories获得到的就是冰箱。
所以:HMAccessory *accessory;
for(accessory in room.accessories)
{ //获取到room中的所有 accessory对象}
HMAccessory *accessory;
for(accessory in hoom.accessories)
{ //获取到hoom中的所有accessory对象}
一旦我们获取到accessory对象,我们就可以展示一个个accessory的相关信息或者访问它的服务和对象这样就可以允许用户控制它,可设置accessory的代理方法并实现这个代理方法。如何控制后边再说,接下来先来说一说接下来这三个问题。
1.怎么找到一个新的accessory
2.如何为accessory指定room
3.如何来移除一个accessory
先说第一个问题:
Accessories封装了物理配件的状态,因此它不能被用户创建,也就是说我们不能去创建智能硬件对象,只能通过去搜寻它,然后添加。想要允许用户给家添加新的配件,我们可以使HMAccessoryBrowser对象在后台搜寻一个与home没有关联的配件,当它找到配件的时候,系统会调用委托方法来通知你的应用程序。
首先,在你需要搜索配件的VC.h文件中声明HMAccessoryBrowserDelegate,添加一个HMAccessoryBrowser对象属性:
然后在.m文件viewdidload里边创建对象设置代理:
创建一个搜索按钮,在按钮的点击方法里开始搜索硬件,并且实现代理方法:
点击按钮开始搜索新的智能硬件,如果搜索到硬件系统会通过didFindNewAccessory这个回调方法来通知我们发现了硬件,每次发现一个智能硬件这个方法都会调用一次(我这里使用模拟器开了两个只能硬件设备),log打印如下:
所以我这里每次发现一个硬件之后装入一个数组,然后用tableview显示出来:
程序运行效果如图:
显示搜索到了洗衣机和电视两个智能硬件我们可以在离开页面的时候停止搜索新的设备:
现在说第二个问题:
拿到一个新的accessory对象之后,我们怎么为其指定一个room呢?
我这边为了方便,先这样处理。上图中我使用一个表把搜索到的设备列出来了,tableview下边的黄色界面是一个scrollview,可以左右滑动展示所有的room。我们点击某一个设备之后,就直接添加给当前显示的room中。如下图:
上图中的两个方法就是将外设添加到home和room中的方法添加外设和指定room的方法都是由HMHome对象调用的。如果我们只是向home中添加了设备,没有指定room那么它就会被放入到一个默认的room中,上文中已经说到了。
下边看一下运行效果,还是上图中搜索到的洗衣机和电视两个智能硬件对象,当我点击了洗衣机之后,
因为使用的是模拟器,所以会有警告框,点击仍然添加就好了。点击之后,会弹出一个系统的配置页面:
上边的黑框是扫码的,我们使用的是模拟器,所以我们点击手动输入代码,将模拟器显示的代码输入进去:
这是输入界面这是模拟器显示的界面,输入红框中的代码:
输入代码代码之后,我们看控制台打印的输出:
此时,我们就成功的向卧室添加了一个洗衣机(我也不知道为什么我向卧室放一个洗衣机,哈哈)。。。。。。接下来我们就可以去更新UI来进行展示了。
现在说第三个问题
我们如何来更改accessory的名字,还有移除一个已经添加到home中的accessory对象呢?
更改名字:
更改名字移除一个设备:
移除设备这一篇基本把Accessory的相关处理介绍了一下,其实还有一些别的零碎东西,这里就不再介绍赘述,这些基本就够用了。获取到智能硬件之后,后边我们继续介绍如何去控制现有的设备,因为这里已经牵扯到了需要使用模拟器了,所以下次还是先介绍一下模拟器的使用。这次就先写到这里demo整理好了,会放到github上。大家一起来搞一搞。共同学习,一起进步!
网友评论