Osheep

时光不回头,当下最重要。

IOS开发之HomeKit(三)

       上一篇文章我们只是介绍了如何获取添加移除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对象属性:

《IOS开发之HomeKit(三)》

然后在.m文件viewdidload里边创建对象设置代理:

《IOS开发之HomeKit(三)》

创建一个搜索按钮,在按钮的点击方法里开始搜索硬件,并且实现代理方法:

《IOS开发之HomeKit(三)》

点击按钮开始搜索新的智能硬件,如果搜索到硬件系统会通过didFindNewAccessory这个回调方法来通知我们发现了硬件,每次发现一个智能硬件这个方法都会调用一次(我这里使用模拟器开了两个只能硬件设备),log打印如下:

《IOS开发之HomeKit(三)》

所以我这里每次发现一个硬件之后装入一个数组,然后用tableview显示出来:

《IOS开发之HomeKit(三)》

程序运行效果如图:

《IOS开发之HomeKit(三)》

显示搜索到了洗衣机和电视两个智能硬件

我们可以在离开页面的时候停止搜索新的设备:

《IOS开发之HomeKit(三)》

当然也可以设定一个btn来停止搜索

现在说第二个问题:

拿到一个新的accessory对象之后,我们怎么为其指定一个room呢?

      我这边为了方便,先这样处理。上图中我使用一个表把搜索到的设备列出来了,tableview下边的黄色界面是一个scrollview,可以左右滑动展示所有的room。我们点击某一个设备之后,就直接添加给当前显示的room中。如下图:

《IOS开发之HomeKit(三)》

上图中的两个方法就是将外设添加到home和room中的方法

添加外设和指定room的方法都是由HMHome对象调用的。如果我们只是向home中添加了设备,没有指定room那么它就会被放入到一个默认的room中,上文中已经说到了。

下边看一下运行效果,还是上图中搜索到的洗衣机和电视两个智能硬件对象,当我点击了洗衣机之后,

《IOS开发之HomeKit(三)》

因为使用的是模拟器,所以会有警告框,点击仍然添加就好了。点击之后,会弹出一个系统的配置页面:

《IOS开发之HomeKit(三)》

上边的黑框是扫码的,我们使用的是模拟器,所以我们点击手动输入代码,将模拟器显示的代码输入进去:

《IOS开发之HomeKit(三)》

这是输入界面

这是模拟器显示的界面,输入红框中的代码:

《IOS开发之HomeKit(三)》

输入代码代码之后,我们看控制台打印的输出:

《IOS开发之HomeKit(三)》

此时,我们就成功的向卧室添加了一个洗衣机(我也不知道为什么我向卧室放一个洗衣机,哈哈)。。。。。。接下来我们就可以去更新UI来进行展示了。

现在说第三个问题

我们如何来更改accessory的名字,还有移除一个已经添加到home中的accessory对象呢?

更改名字:

《IOS开发之HomeKit(三)》

更改名字

移除一个设备:

《IOS开发之HomeKit(三)》

移除设备

       这一篇基本把Accessory的相关处理介绍了一下,其实还有一些别的零碎东西,这里就不再介绍赘述,这些基本就够用了。获取到智能硬件之后,后边我们继续介绍如何去控制现有的设备,因为这里已经牵扯到了需要使用模拟器了,所以下次还是先介绍一下模拟器的使用。这次就先写到这里demo整理好了,会放到github上。大家一起来搞一搞。共同学习,一起进步!


点赞