homekit这个框架是用来沟通和控制我们的家庭智能硬件的。这些智能硬件都是支持HomeKit Accessory Protocol的。homekit应用程序可以让用户去发现并且配置家庭里的这些兼容硬件的。它支持远程访问,支持多个用户和多个用户设备!
上码:
@implementation MyHomeKit
- (void)initMyHomeKit {
self.homeManager = [[HMHomeManager alloc] init];
self.homeManager.delegate = self;
}
#pragma mark 这些都是home的操作方法
- (void)addHome:(NSString *)homeName {
[self.homeManager addHomeWithName:homeName completionHandler:^(HMHome * _Nullable home, NSError * _Nullable error) {
NSLog(@"%@", homeName);
}];
}
- (void)removeHome:(HMHome *)home {
[self.homeManager removeHome:home completionHandler:^(NSError * _Nullable error) {
NSLog(@"%@", home);
}];
}
#pragma mark homeKitManager的四个代理方法
// 其中第一个方法是homeManager初始化之后的回调,我们对数据进行操作的时候,应该再其初始化之后进行。
// 初始化之后我们在其回调方法中可以获取到manager.homes,这是一个数组,里边是用户的全部HMhome对象,我们可以遍历这个数组获取到全部的home,通过home.name得到home的名字。
// 获取所有的home资源
- (void)homeManagerDidUpdateHomes:(HMHomeManager *)manager {
// 获取到的homes
NSLog(@"已经获取到的homes资源 %@", manager.homes);
[[NSNotificationCenter defaultCenter] postNotificationName:@"get homes" object:nil userInfo:nil];
}
// add
- (void)homeManager:(HMHomeManager *)manager didAddHome:(HMHome *)home {
NSLog(@"已经添加的home: %@", home);
NSLog(@"%@", home.name);
}
// remove
- (void)homeManager:(HMHomeManager *)manager didRemoveHome:(HMHome *)home {
NSLog(@"已经移除的home:%@", home);
NSLog(@"%@", home.name);
}
在这里的对应的每一个add,都有一个与之对应的remove,相关操作方法可以点进去详细看了解一下,在这里不一一赘述了
// 获取到HMhome对象之后可以通过home.rooms获取到该home的全部room。同样通过遍历这个数组获取到全部的HMroom对象,然后通过room.name获取到room的名字。
#pragma mark home的代理方法
- (void)homeDidUpdateName:(HMHome *)home {
NSLog(@"已经更换了home的名字: %@",home);
}
- (void)home:(HMHome *)home didAddAccessory:(HMAccessory *)accessory {
NSLog(@"已经添加的智能设备: %@", accessory);
}
- (void)home:(HMHome *)home didAddUser:(HMUser *)user {
NSLog(@"%@", user);
}
- (void)home:(HMHome *)home didUpdateRoom:(HMRoom *)room forAccessory:(HMAccessory *)accessory {
NSLog(@"一个房间新添了一个设备 :%@",accessory);
}
- (void)home:(HMHome *)home didAddRoom:(HMRoom *)room {
NSLog(@"新添加一个房间 %@", room);
}
- (void)home:(HMHome *)home didAddZone:(HMZone *)zone {
NSLog(@" 已经添加了一个空间 %@", zone);
}
- (void)home:(HMHome *)home didAddRoom:(HMRoom *)room toZone:(HMZone *)zone {
NSLog(@"已经添加了一个房间到一个空间");
}
- (void)home:(HMHome *)home didAddServiceGroup:(HMServiceGroup *)group {
NSLog(@"已经添加了一个 服务组");
}
...
...
...
self.accBrowser = [[HMAccessoryBrowser alloc] init];
self.accBrowser.delegate = self;
#pragma mark - HMAccessoryBrowserDelegate
- (void)accessoryBrowser:(HMAccessoryBrowser *)browser didFindNewAccessory:(HMAccessory *)accessory {
NSLog(@"搜索新设备结束 : %@", accessory);
[self.accArray addObject:accessory];
[self.accTableView reloadData];
}
- (void)accessoryBrowser:(HMAccessoryBrowser *)browser didRemoveNewAccessory:(HMAccessory *)accessory {
NSLog(@"移除了设备 %@", accessory);
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
int num = self.scrollView.contentOffset.x / self.view.bounds.size.width;
HMAccessory *acc = self.accArray[indexPath.row];
__block HMHome *home = self.home;
__block HMRoom *room = self.roomArray[num];
[self.home addAccessory:acc completionHandler:^(NSError * _Nullable error) {
if (!error) {
if (acc.room != room) {
[home assignAccessory:acc toRoom:room completionHandler:^(NSError * _Nullable error) {
if (!error) {
NSLog(@"已经将设备放入 %@", room.name);
} else {
NSLog(@"放入失败 %@", error);
}
}];
} else {
NSLog(@"硬件添加home失败 %@",error);
}
}
}];
}
HMAccessory *accName = self.accArray[indexPath.row];
[accName updateName:@"更该设备名字" completionHandler:^(NSError * _Nullable error) {
if (!error) {
NSLog(@"更改设备名字成功 %@",accName.name);
} else {
NSLog(@"%@", error);
}
}];
}
HMAccessory *removeAcc = self.accArray[indexPath.row];
__block HMHome *accHome = self.home;
[accHome removeAccessory:removeAcc completionHandler:^(NSError * _Nullable error) {
if (!error) {
NSLog(@"移除设备成功 %@", removeAcc);
} else {
NSLog(@"移除失败 %@",error);
}
打开APP设置一个按钮,在room中添加一个硬件设备,选择进行操作
// 拿到智能硬件,首先 获取硬件,开启所有服务
HMAccessory *serviceAcc = self.accArray[indexPath.row];
NSArray *serviceArr = serviceAcc.services;
serviceAcc.delegate = self;
for (HMService *service in serviceArr) {
// 获取服务中的所有特征
NSArray *chaArr = service.characteristics;
for (HMCharacteristic *cha in chaArr) {
// 判断得到的属性是读写属性:开始赋值
if ([cha isEqual:HMCharacteristicPropertyReadable]) {
self.chaTX = cha;
} else {
// 通过打印这个值发现,chaTX 这个值既可以读又可以写,所以接下来不管是写入还是读取都用这个值
self.chaRX = cha;
[self.chaRX enableNotification:YES completionHandler:^(NSError * _Nullable error) {
NSLog(@"这个通知可以用来接受外设的notify,类似于蓝牙BLE开发中的通知");
}];
}
}
// 判断这个读写特征,就读写它的值
if (self.chaRX) {
[self.chaRX readValueWithCompletionHandler:^(NSError * _Nullable error) {
if (!error) {
// 判断value的状态来控制开关
id value = self.chaRX.value;
// 如果当前状态是0那么就是关闭,写入一个1打开
if ([value integerValue] == 0) {
[self.chaRX writeValue:@(1) completionHandler:^(NSError * _Nullable error) {
if (!error) {
NSLog(@"写入成功");
} else {
NSLog(@"写入失败 %@", error);
}
}];
} else {
[self.chaRX writeValue:@(1) completionHandler:^(NSError * _Nullable error) {
if (!error) {
NSLog(@"转变成功");
} else {
NSLog(@"%@",error);
}
}];
}
}
}];
}
}
最后根据产品要求,在HMAccessoryDelegate回调中更新判断显示状态!
#pragma mark - HMAccessoryDelegate
- (void)accessory:(HMAccessory *)accessory service:(HMService *)service didUpdateValueForCharacteristic:(HMCharacteristic *)characteristic {
NSLog(@"%@", characteristic.value);
}
到这里,关于HomeKit的基本使用就结束了。。。