IOS开发之HomeKit(三)

作者: 在海边的人 | 来源:发表于2016-09-29 22:43 被阅读2463次

           上一篇文章我们只是介绍了如何获取添加移除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显示出来:

    程序运行效果如图:

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

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

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

    现在说第二个问题:

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

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

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

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

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

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

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

    这是输入界面

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

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

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

    现在说第三个问题

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

    更改名字:

    更改名字

    移除一个设备:

    移除设备


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


    相关文章

      网友评论

      • 悟2023:博主你文章里的 rooArry这个数组中的HMRoom从哪里获取的?
      • d2587c509cae:您好,我搜索到了模拟器上自己创建的设备,但是里面却没有服务。我是看着你写的来做的。模拟器中我也添加服务,但是就是没有。不知道怎么回事?
        d2587c509cae:@5579347b9854 用模拟器也可以。我现在可以搜索到了。不知道是不是HomeKitAccessorySimulator的问题,我刚创建的时候是搜不到,但是过几天又能搜索到了。不知道是什么问题。
        5579347b9854:应该是要真机吧
      • 94543f8c3234:你好,按照这篇介绍,程序可以发现homekit accessory simulator的设备,但是当我添加设备的时候,没有显示配置添加页面,也是显示Couldn't add Switch(发现的设备名字), Home couldn't connect to this accessory. 请问这是怎么回事??
        FUZZ:@昵称真的很难想 你好,我也碰到跟你一样的问题,请问你解决了吗?
        94543f8c3234:我把整个过程录下来然后慢放,发现添加配件页面是显示的,但是就是一瞬间,还不等完全显示输入homekit代码马上就变成了couldn't connect界面。
      • 奔奔奔跑:Homekit开发者交流的还是有点少哦,作者有联系方式或者群吗,能不能交流一下?
      • enuola:在给home添加accessory的时候,出现error,HMErrorCodeDomain:59,错误描述:Accessory response error when communicating with accessory.
请问这种情况下如何解决?明明HomeKit Accessory Simulator是开启的,为什么连接失败呢?
        在海边的人:@enuola 不是真机测试的话,会有很多问题的。你可以去找个帖子解决一下手机模拟器链接蓝牙的问题,我以前看过不过没存,你可能需要自己去找一下,不好意思
        enuola:@在海边的人 我是模拟器,那就是说电脑的人蓝牙得打开咯,我现在是关闭的。我打开试一下
        在海边的人:@enuola 我目前还没有遇到过这种错误。先用系统自带的app链接一下,如果系统的都连不上,那就是你模拟器设置问题。如果可以连上,再确定代码哪里出了问题。手机的蓝牙开关一定要打开哦
      • BD先生:我想 问下三与四的代码在哪上传的?

      本文标题:IOS开发之HomeKit(三)

      本文链接:https://www.haomeiwen.com/subject/zfdkyttx.html