前言
最近剛剛弄完HomeKit項目,寫個教程當做個筆記。之前沒有接觸個HomeKit,剛開始的時候一臉的蒙蔽,200多頁的英文協議,看了一下目錄瞬間就關上了,然后上網找一些相關的文檔,不過基本上都是官方提供的開發指南,其實文檔說的還蠻清楚的,但是對與沒有接觸HomeKit的來說還是不知道如何下手。下面我就簡單寫寫一些主要功能怎么用。
HomeKit開發指南:開發指南(中文版)
正文
對于如何集成HomeKit,官方文檔說的很清楚,我就不在多說了。
對于HomeKit是什么以及感念之類的你都可以參考他的開發指南。
普通的HomeKit基本包含幾個概念,home (家庭),room(房間) ,zone(控件,可以沒有),accessory(配件),service(服務),characteristic(特性)這幾類,他們之間是從大到小的包含關系。
1.homeManager(房間管理)
HomeKit會有一個或者多個家庭,但是最少是一個。我們要怎么管理或者創建家庭呢。
homeManager創建的時候,HomeKit就開始從HomeKit數據庫獲取這些homes和相關對象。
然后實現代理方法
當你的房間發生變化的時候會走這些代理方法。不要忘記導入頭文件,和在.h中加入<HomeManagerDelegate>
這樣我們就可以用homeManager來管理我們的房間了。那么如何來操作房間呢,
這個homeManager有幾個屬性,primaryHome,和homes
<pre>
HMHome *home = homeManager.primaryHome; //拿到你的主家庭NSArray *homeArray = homeManger.homes; //獲取到所有的家庭
</pre>
對于家庭的一些操作,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,他把每個屬性的要求說的很清楚。錯誤不一定是咱們代碼的事,可能是設備的某個特性沒有遵守協議的規則造成的,不過你自己要準確的定位錯誤再下結論。