iOS开发Swift

HomeKit 开发教程(基础篇)

前言


最近刚刚弄完HomeKit项目,写个教程当做个笔记。之前没有接触个HomeKit,刚开始的时候一脸的蒙蔽,200多页的英文协议,看了一下目录瞬间就关上了,然后上网找一些相关的文档,不过基本上都是官方提供的开发指南,其实文档说的还蛮清楚的,但是对与没有接触HomeKit的来说还是不知道如何下手。下面我就简单写写一些主要功能怎么用。

正文


对于如何集成HomeKit,官方文档说的很清楚,我就不在多说了。
对于HomeKit是什么以及感念之类的你都可以参考他的开发指南。
普通的HomeKit基本包含几个概念,home (家庭),room(房间) ,zone(控件,可以没有),accessory(配件),service(服务),characteristic(特性)这几类,他们之间是从大到小的包含关系。

1.homeManager(房间管理)


HomeKit会有一个或者多个家庭,但是最少是一个。我们要怎么管理或者创建家庭呢。

homeManager创建的时候,HomeKit就开始从HomeKit数据库获取这些homes和相关对象。
然后实现代理方法

当你的房间发生变化的时候会走这些代理方法。不要忘记导入头文件,和在.h中加入
这样我们就可以用homeManager来管理我们的房间了。那么如何来操作房间呢,
这个homeManager有几个属性,primaryHome,和homes

 HMHome *home = homeManager.primaryHome; //拿到你的主家庭NSArray *homeArray = homeManger.homes; //获取到所有的家庭

对于家庭的一些操作,homeManager 的一些方法

- (void)updatePrimaryHome:(HMHome *)home completionHandler:(void (^)(NSError * __nullable error))completion    //修改为主家庭
- (void)addHomeWithName:(NSString *)homeName completionHandler:(void (^)(HMHome * __nullable home, NSError * __nullable error))completion   //新增家庭
- (void)removeHome:(HMHome *)home completionHandler:(void (^)(NSError * __nullable error))completion   //删除家庭

以修改为主家庭为例说一说,主家庭的意思是,你当前要管理的家庭,你只能管理你当前家庭内的房间或者配件,若你想管理其他家庭,那你从homeArray中拿出一个家庭,调用上面方法就OK了。新增跟删除我猜你们已经会了,我就不再都说了。

2.home(家庭)


home就是从homeManager拿出来的一个家庭,然后拿着这个home搞一些事情,home中有太多的事情可以搞了,比如说在这个home中添加一个房间,或者配件呀,给房间改个名字呀,看看这个home有多少个房间或者配件呀,等等。太多了,我就不挨个说了,如果你真想知道我告诉你个办法,在你的项目中按住command 然后鼠标点一下HMHome,你就知道了,是不是很简单,home(家庭)有了,就要给这个home加配件(accessory)了。

3.accessory(配件)


这个配件就稍微麻烦一点点,加入配件你得先能找得到配件,若何发现配件。
创建HMAccessoryBrowser对象

HMAccessoryBrowser *accessoryBrowser = [[HMAccessoryBrowser alloc] init] ;
accessoryBrowser.delegate = self;

然后实现代理方法,实现哪些代理方法自己去HMAccessoryBrowser里面看一看

[accessoryBrowser startSearchingForNewAccessories];  //开始搜索配件
[accessoryBrowser stopSearchingForNewAccessories];  //结束搜索配件

当有配件被发现的时候会走didFindNewAccessory代理方法,然后你只需要

NSArray *accessoryArray = accessoryBrowser.discoveredAccessories;    //拿出已经找到的配件

从发现的配件数组总拿出一个 HMAccessory *accessory,然后调用

[homeManager.primaryHome addAccessory:accessory completionHandler:^(NSError *error) {}];    //添加配件

走这段代码的时候,会自动跳到HomeKit提供的界面,他会帮你处理扫描密码和配对过程,这样就把配件加入到房间中。这里有一点要说明一下,配件实际是应该加入到room中的,如果你还没有创建room,那会自动把配件加入到默认room中,怎么创建room呢,我就不说了,就是用HMHome的对象 addRoom…什么什么的我有点记不清了,移除removeRoom…什么什么的,房间我就不多少了,accessory(配件)或者房间(home)添加成功后他会通知代理,你就可以刷新界面了,就是这么简单。如果你的添加或者删除操作失败了会返回给你个error,这个error你可以参照HMError来看一下是什么导致的错误。
在accessory的对象中你就可以获取到配件中的services(服务),name,是否在线,UUID,在哪个room下,还有一些属性和代理方法去看看他自己的接口。

4.service(服务)


服务就是你这个配件中都有哪些服务,说白了就是对这个配件功能的分类,服务是分类型的,当你添加完配件之后,里面肯定有至少服务,这个服务里面放着你的配件的基本信息,这些是必须有的,要是没有的话你的配件是添加不上的,所以这点不是ios程序员该关心的,我们关心的是有哪些服务,服务里面有哪些characteristic(特性)。强调一点每个服务都是分类型的,

NSArray *serviceArray = accessory.services;    //获取服务数组

你要获取拿到哪一个服务可以根据类型来判断。服务只可以修改名字和类型的方法 ,属性有很多,不过我只用到了name(名字),characteristics(特性数组),associatedServiceType(类型),其他的看看接口吧,说的还是蛮详细的。

5.characteristic(特性)


特性就是你的这个配件的信息和操作了。特性也有多类型,比如开关类型;brightness(调光),还可以自定义类型,类型使用UUID来区分,自定义的类型用UUID是不一样,不是自定义的类型UUID是固定的,没了特性都会有value。你可以characteristic.value 看的到,每种特性还会分为,只读,只写,读写,可以写的是可以通过

[characteristic writeValue:tagetValue completionHandler:^(NSError *error)
{  //code
}];

来修改这个特性的value值,达到控制设备的操作。

6.user(用户)


每个创建home的用户都是这个home的管理者,你可以邀请其他人到你的家来。同样你也可以删掉。除了管理者这之外的人,不可以改变home的格局,但是可以识别智能电器、读写特性、观察特性值变化、执行动作集。
在ios9以后,只需要调用

[home manageUsersWithCompletionHandler:^(NSError * _Nullable error) {
}];

HomeKit会帮你管理你的user;不过在9之前,添加,删除用户是分开管理的,例如添加

[self.home addUserWithCompletionHandler:^(HMUser *user, NSError *error) {
}];

HomeKit数据库


每个Home都有一个HomeKit数据库。如下图所示,HomeKit数据库会安全地和home授权的用户的iOS设备以及潜在的客人的iOS设备进行同步。为了给用户展示当前最新的数据,你的应用需要观察HomeKit数据库的变化。

关于数据库,看明白这个图就可以了。

总结


基本的东西大概就这么多了,其他的多参照开发指南和HomeKit接口,最后写几点总结

  • 1.一定要搞明白HomeKit整个过程是怎么回事,一旦清楚,真是得心应手,你想要什么,你想做什么操作,直接用就OK,都是现成的接口属性,对于初学者来说,一定要多看几遍开发指南,不要感觉看两遍你就知道怎么回事,里面涵盖太多的东西了,当你屡不清了,你就看一遍肯定会有新的收获。
  • 2.在你开发的时候遇到错误的时候,你可以看看HomeKit的那个200多页的英文协议,你要是有时间的换从头到尾看一遍,没时间的话就当个字典用就OK,他把每个属性的要求说的很清楚。错误不一定是咱们代码的事,可能是设备的某个特性没有遵守协议的规则造成的,不过你自己要准确的定位错误再下结论。