【问题标题】:Unpinning HomeKit accessory取消固定 HomeKit 配件
【发布时间】:2015-07-02 07:45:52
【问题描述】:

HomeKit 配件模拟器作为一个小按钮,可以让设备不公平。

鉴于它是一个附件模拟器,我推测有一些硬件编程规范允许编写取消配对功能。

但是,将它也作为 HomeKit 框架 的一部分来实现并允许客户端开发人员通过 HomesController 类(和派生类)来实现它可能是有意义的。


--> 短版:

HMServiceHMCharacteristic 或 HomeKit 框架中是否有任何方法可以解除与家庭的特征/服务的配对?

【问题讨论】:

    标签: ios ios8 ios9 homekit


    【解决方案1】:

    服务或特征不能取消配对,实际上不需要这样做。
    可以在家中取消配对配件。

    您可以调用 HMHome 类的方法来移除/取消配对配件。

    - (void)removeAccessory:(HMAccessory *)accessory 
            completionHandler:(void (^)(NSError *error))completion;
    

    并且配对 - 重置按钮在 Homekit Accessory Simulator 中提供了一个选项,您可以随时取消配件与 iOS 应用的配对。

    重置如果您一次没有相同的设备或 Homekit 配置从 iOS 应用中的设置重置,则可能需要。

    【讨论】:

      【解决方案2】:

      取消配对基本上相当于从 HomeKit 主页 (HMHome) 下移除该配件。这可以通过使用 HMHome 下的 api 调用来实现(可以通过从您的视图控制器单击按钮来触发):

      示例代码:

      [yourHMHome removeAccessory:accessory_ completionHandler:^(NSError *error) {
          if (error) {
              //Handle your error here.
          } else {
              //Removing, or here, un-pairing was successful, do anything else
             //Example
              [[YourExampleHomeStore sharedStore] updateAccessoryDelegates];
              YourCompletionHandler(error);
          }
      }];
      

      这回答了您关于取消配对的问题。 HMService 和 HMCharacteristic 在概念上是不同的。如果您想更新(可写的)HMCharacteristic 的值,那么您将在可用的 HMServices 中搜索该 HMCharacteristic。请记住,配件上可用的 HMServices 和因此 HMCharacteristics 将根据其配对状态而完全不同。大多数读写和'paired-read'和'paired-write',当处于未配对状态时,你只能读取'accessory information service'(名称、型号等)

      现在,假设您要读取或更改(写入)HMCharacteristic 的值,假设它是序列号,步骤如下:

      1. 获取相关的 HMCharacteristic

      序列号的示例代码可能是这样的:

      注意:如果附件无法访问,则返回空字符串。

      +(NSString *)getSerialNumberFromHMAccessory:(HMAccessory *)accessory
      {
      
      if (!accessory || !accessory.reachable) { return @""; }
      
      for (HMService *service in accessory.services) {
          NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@", @"characteristicType", HMCharacteristicTypeSerialNumber];
          NSArray *result = [service.characteristics filteredArrayUsingPredicate:predicate];
          if (result && [result count] > 0 && [result[0] isKindOfClass:[HMCharacteristic class]]) {
              HMCharacteristic *serialNumChar = (HMCharacteristic *)result[0];
              NSString *serialNum = [serialNumChar valueForKey:@"value"];
              if (serialNum && [serialNum length] > 0) {
                  NSLog(@"Found serial number: %@ for accessory named \"%@\"", serialNum, accessory.name);
                  return serialNum;
              }
          }
      }
      
      return @"";
      }
      
      1. 找到所需的 HMCharacteristic 后,您可以调用 HomeKit api 来增加您的兴趣(例如更新值等)。在这里,由于序列号是不可写的,您只需阅读它就可以了。

      无论如何,可能是咆哮了太久,偏离了主要问题。希望这对你有所帮助。干杯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 2019-12-12
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        相关资源
        最近更新 更多