【问题标题】:How to compare instances of HMAccessory如何比较 HMAccessory 的实例
【发布时间】:2015-12-01 21:13:15
【问题描述】:

从 iOS9 开始,HMAccessory 的 identifier 属性已经贬值。还有其他方法可以比较 HMAccessory 的两个不同实例吗?

【问题讨论】:

    标签: ios9 homekit hmaccessory


    【解决方案1】:

    在 iOS 9 中确定 HMAccessory 的新方法是使用

    @available(iOS 9.0, *)
    @NSCopying public var uniqueIdentifier: NSUUID { get }
    

    【讨论】:

    • 感谢您解决这个问题。在线文档中未提及此属性是否有原因?
    【解决方案2】:

    有几种方法可以做到这一点。正如@Maria 提到的,从iOS9 开始,您拥有NSUUID 属性'uniqueIdentifier':

    @property(readonly, copy, nonatomic) NSUUID *uniqueIdentifier NS_AVAILABLE_IOS(9_0);
    

    此外,您可以使用序列号特征类型来比较 HMAccessories,但是请记住:您应该检查配件的“可达性”和“已阻止”状态。如果配件无法访问或被阻止,则您可能无法读取序列号。

    最后,我在 Objective C 中包含了一个实用代码 sn-p(想要 Swift?只是问问,或者更好的是,将其用作练习;)):

    /** @discussion:如果无法访问附件,则返回空字符串。 无法获取处于无法访问状态的实际序列号。* */

    [粘贴时请注明]

    + (NSString *)getSerialNumberFromHMAccessory:(HMAccessory *)accessory {
        if (!accessory || !accessory.reachable || accessory.isBlocked) {
            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) {
                    //DDLogInfo(@"Found serial number: %@ for accessory named \"%@\"", serialNum, accessory.name);
                    return serialNum;
                }
            }
        }
    
        return @"";
    }
    

    【讨论】:

    • 您的回答可能对@Christian R 没有帮助,但它让我很开心。我正在寻找一种在 homekit 安装后检索 mac 地址的方法!
    【解决方案3】:

    好的,想出了一个解决方案。有一个HMCharaceteristicHMCharaceteristicTypeSerialNumber。扩展至HMAccessory:

    extension HMAccessory {
     var serialNumber: String? {
      get {
       for service in services {
        for characteristic in service.characteristics {
         if characteristic.characteristicType == HMCharacteristicTypeSerialNumber {
          return characteristic.value as? String
         }
        }
       }
       return nil
      }
     }
    }
    

    现在可以比较:

    accessory1.serialNumber == accessory2.serialNumber
    

    还有其他解决方案吗?

    【讨论】:

    • 1.检查附件“可达性”和“已阻止”状态。 2. serialNumber 是 NSString 类型。使用 NSString 可比性检查:“isEqualToString”而不是“==”是你这么倾向于这样做。
    猜你喜欢
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多