2015-12-01 32 views

回答

4

新办法确定的iOS 9 HMAccessory是使用

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

感谢您解决这个问题。在线文档中没有提及此属性的原因是什么? –

-1

好吧想出了一个解决方案。有一个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 

任何其他解决办法?

+0

1.检查附件“可达性”和“封锁”状态。 2. serialNumber的类型是NSString。使用NSString可比性检查:“isEqualToString”而不是“==”,你是这样倾向于这样做。 –

0

有几种方法可以做到这一点。作为@Maria提到,从iOS9起,你有NSUUID财产“唯一标识符”:

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

此外,您还可以利用SERIALNUMBER characteristicType比较HMAccessories,但是,请记住:你应该检查配件'可达性“和”阻塞“状态。如果附件不可用或被阻塞,则可能无法读取序列号。

最后,我已经包括在目标C的实用程序代码片段(希望斯威夫特只问,或者更好,用它作为一个练习;?)):

/** @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 @""; 
} 
+0

你的回答可能没有帮助@Christian R,但它使我的一天。 我正在寻找一种方法来检索homekit安装后的mac地址! –