如何比较 HMAccessory 的实例
How to compare instances of HMAccessory
自 iOS9 以来,HMAccessory
的 identifier
属性 已贬值。还有另一种方法可以比较两个不同的附件实例吗?
好吧想出了一个解决方案。有一个HMCharaceteristic
HMCharaceteristicTypeSerialNumber
。对 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
还有其他解决方案吗?
在 iOS 9 中确定 HMAccessory 的新方法是使用
@available(iOS 9.0, *)
@NSCopying public var uniqueIdentifier: NSUUID { get }
有几种方法可以做到这一点。正如@Maria 提到的,从 iOS9 开始,您拥有 NSUUID 属性 'uniqueIdentifier':
@property(readonly, copy, nonatomic) NSUUID *uniqueIdentifier NS_AVAILABLE_IOS(9_0);
此外,您可以使用 serialNumber characteristicType 来比较 HMAccessories,但是,请记住:您应该检查附件的 'reachability' 和 'blocked' 状态。如果配件无法到达或被挡住,那么您可能无法读取序列号。
最后,我在 Objective C 中包含了一个实用代码片段(想要 Swift?尽管问,或者更好的是,将其用作练习 ;)):
/**
@discussion: Returns 如果无法访问附件,则为空字符串。
无法获取处于无法访问状态的实际序列号。*
*/
[如有粘贴请注明]
+ (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 @"";
}
自 iOS9 以来,HMAccessory
的 identifier
属性 已贬值。还有另一种方法可以比较两个不同的附件实例吗?
好吧想出了一个解决方案。有一个HMCharaceteristic
HMCharaceteristicTypeSerialNumber
。对 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
还有其他解决方案吗?
在 iOS 9 中确定 HMAccessory 的新方法是使用
@available(iOS 9.0, *)
@NSCopying public var uniqueIdentifier: NSUUID { get }
有几种方法可以做到这一点。正如@Maria 提到的,从 iOS9 开始,您拥有 NSUUID 属性 'uniqueIdentifier':
@property(readonly, copy, nonatomic) NSUUID *uniqueIdentifier NS_AVAILABLE_IOS(9_0);
此外,您可以使用 serialNumber characteristicType 来比较 HMAccessories,但是,请记住:您应该检查附件的 'reachability' 和 'blocked' 状态。如果配件无法到达或被挡住,那么您可能无法读取序列号。
最后,我在 Objective C 中包含了一个实用代码片段(想要 Swift?尽管问,或者更好的是,将其用作练习 ;)):
/** @discussion: Returns 如果无法访问附件,则为空字符串。 无法获取处于无法访问状态的实际序列号。* */
[如有粘贴请注明]
+ (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 @"";
}