在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ iOS/ 訪問服務(wù)和特性
簡(jiǎn)介
觀察 HomeKit 數(shù)據(jù)庫(kù)的變化
測(cè)試 HomeKitApp
創(chuàng)建 Homes 和添加 Accessories
創(chuàng)建 Home 布局
創(chuàng)建動(dòng)作集和觸發(fā)器
訪問服務(wù)和特性
啟用 HomeKit
用戶管理

訪問服務(wù)和特性

服務(wù)(HMService)代表了一個(gè)配件(accessory)的某個(gè)功能和一些具有可讀寫的特性(HMCharacteristic)。一個(gè)配件可以擁有多項(xiàng)服務(wù),一個(gè)服務(wù)也可以有很多特性。比如一個(gè)車庫(kù)開門器可能擁有一個(gè)照明和開關(guān)的服務(wù)。照明服務(wù)可能擁有打開/關(guān)閉和調(diào)節(jié)亮度的特性。用戶不能制造智能家電配件和它們的服務(wù)-配件制造商會(huì)制造配件和它們的服務(wù)-但是用戶可以改變服務(wù)的特性。一些擁有可讀寫屬性的特性代表著某種物理狀態(tài),比如,一個(gè)恒溫器中的當(dāng)前溫度就是一個(gè)只可讀的值,但是目標(biāo)溫度又是可讀寫的。蘋果預(yù)先定義了一些服務(wù)和特性的名稱,以便讓 Siri 能夠識(shí)別它們。

獲得配件的服務(wù)和屬性

在依照 Getting the Accessroties in a Room 中描述,你創(chuàng)建了一個(gè)配件對(duì)象之后,你可以獲得配件的服務(wù)和特性。當(dāng)然你也可以直接從 home 中按照類型獲得不同的服務(wù)。

重要:不要暴露匿名服務(wù)-比如固件升級(jí)服務(wù)-給用戶

通過 HMAccessory 類對(duì)象的 services 屬性,我們可以獲得一個(gè)配件的服務(wù)。

NSArray *services = accessroy.services;

要獲得一個(gè) home 當(dāng)中配件提供的特定服務(wù),使用 HMHome 類對(duì)象的 servicesWithTypes:方法。

// Get all lights and thermostats in a home
NSArray *lightServices = [home servicesWithTypes:[HMServicesTypeLightbulb]];
NSArray *thermostatServices = [home servicesWithTypes:[HMServicesTypeThermostat]];

使用 HMServices 類對(duì)象的 name 屬性來(lái)獲得服務(wù)的名稱

NSString *name = services.name;

要獲得一個(gè)服務(wù)的特性,請(qǐng)使用 characteristics 屬性。

NSArray *characteristics = service.characteristics

使用 servicesType 屬性來(lái)獲得服務(wù)的類型

NSString *serviceType = service.serviceType;

蘋果定義了一些服務(wù)類型,并能被 Siri 識(shí)別:

  • 門鎖(Door locks)
  • 車庫(kù)開門器(Garage door openers)
  • 燈光(Lights)
  • 插座(Outlets)
  • 恒溫器(Thermostats)

改變服務(wù)名稱

使用 updateName:completionHandler:異步方法來(lái)改變服務(wù)名稱。傳入此方法的服務(wù)名稱參數(shù)必須在一個(gè) home 當(dāng)中是唯一的,并且服務(wù)名可被 Siri 識(shí)別。

[service updateName:@"Garage 1 Opener" completionHandler:^(NSError *error) {
    if (error) {
        // Failed to change the name
    } else {
        // Successfully changed the name
    }
}];

訪問特性的值

特性代表了一個(gè)服務(wù)的一個(gè)參數(shù),它要么是只讀、可讀寫或者只寫。它提供了這個(gè)參數(shù)可能的值的信息,比如,一個(gè)布爾或者一個(gè)范圍值。恒溫器中的溫度就是只讀的,而目標(biāo)溫度又是可讀寫的。一個(gè)執(zhí)行某個(gè)任務(wù)的命令且不要求任何返回-比如播放一段聲音或者閃爍一下燈光來(lái)確認(rèn)某個(gè)配件-可能就是只寫的。

蘋果定義了一些特性的類型,并能被Siri識(shí)別:

  • 亮度(Brightness)
  • 最近溫度(Current temperature)
  • 鎖的狀態(tài)(Lock state)
  • 電源的狀態(tài)(Power state)
  • 目標(biāo)狀態(tài)(Target state)
  • 目標(biāo)溫度(Target temperature)

比如,對(duì)于一個(gè)車庫(kù)開門器來(lái)說,目標(biāo)狀態(tài)就是打開或者關(guān)閉。對(duì)于一個(gè)鎖來(lái)說,目標(biāo)狀態(tài)又是上鎖和未上鎖。

在你獲得了一個(gè) HMService 對(duì)象之后,如 Getting Services and Their Properties 所描述的,你可以獲得每個(gè)服務(wù)的特性的值。因?yàn)檫@些值是從配件中獲得的,這些讀寫的方法都是異步的,并可以傳入一個(gè)完成回調(diào)的 block。

使用 readValueWithCompletionHandler:異步方法來(lái)讀取一個(gè)特性的值。

[characteristic readValueWithCompletionHandler:^(NSError *error) {
    if (error == nil) {
       // Successfully read the value
       id value = characteristic.value;
    }
    else {
       // Unable to read the value
} }];

在 if 語(yǔ)句塊中,加入你的代碼以更新 App 的視圖。

使用 writeValue:completionHandler:異步方法來(lái)向一個(gè)特性寫入值。

[self.characteristic writeValue:@42 withCompletionHandler:^(NSError *error) {
    if (error == nil) {
       // Successfully wrote the value
    }
    else {
       // Unable to write the value
} }];

不要以為函數(shù)調(diào)用完成就意味著寫入成功,實(shí)際上只有在當(dāng)完成回調(diào)執(zhí)行并沒有錯(cuò)誤產(chǎn)生時(shí)才表示寫入成功。比如,直到一個(gè)開關(guān)的特性改變之前都不要改變這個(gè)開關(guān)的狀態(tài)。在 if 語(yǔ)句塊中,加入你的代碼,以更新 App 的視圖。

另外,在別的app更新了特性的值時(shí)也需要更新視圖,在Observing Changes to Accessories中有描述。

創(chuàng)建服務(wù)組

一個(gè)服務(wù)組(HMServiceGroup)提供了控制不同配件的任意數(shù)量服務(wù)的快捷方式-比如,當(dāng)用戶離開家之后控制家中的某些燈。

http://wiki.jikexueyuan.com/project/homekit/images/homekit7.png" alt="" />

在你創(chuàng)建了一個(gè) HMHome 對(duì)象之后,如 Getting the Primary Home and Collection of Homes 中描述,你也就在這個(gè)家中創(chuàng)建一個(gè)服務(wù)組。

為了創(chuàng)建一個(gè)服務(wù)組,我們使用 HMHome 類對(duì)象的 addServiceGroupWithName:completionHandler:方法。方法中參數(shù)服務(wù)組的名稱必須在此家中唯一,并可以被 Siri 識(shí)別。

[self.home addServiceGroupWithName:@"Away Lights" completionHandler:^(HMServiceGroup *serviceGroup, NSError *error) {
    if (error == nil) {
       // Successfully created the service group
} else {
       // Unable to create the service group
    }];

我們使用 HMServiceGroup 類對(duì)象的 addService:completionHandler:方法來(lái)向服務(wù)組中添加一個(gè)服務(wù)。服務(wù)可以在一個(gè)或多個(gè)服務(wù)組中。

[serviceGroup addService:service completionHandler:^(NSError *error) {
    if (error == nil) {
       // Successfully added service to service group
    }
       // Unable to add the service to the service group
    }];

通過 HMHome 類對(duì)象的 serviceGroups 屬性,來(lái)獲得這個(gè)家的所有服務(wù)組。

NSArray *serviceGroups = self.home.serviceGroups;

通過 HMServiceGroup 類對(duì)象的 accessory 屬性,我們獲得服務(wù)所對(duì)應(yīng)的智能電器。

HMAccessory *accessory = service.accessory;

和配件類似,代理方法在別的 App 改變服務(wù)組時(shí)也會(huì)被調(diào)用。如果你的app使用了服務(wù)組,請(qǐng)閱讀 HMHomeDelegate Protocol Reference 文檔,獲悉你應(yīng)該實(shí)現(xiàn)哪些方法以觀察這些變化。