【发布时间】:2014-01-06 04:07:54
【问题描述】:
我知道您可以使用此服务让智能手表等设备拦截来自 iOS 设备的通知。但是你能通过 OS X 在 Mac 上接收这些 iOS 通知吗?
我希望能够让我的 OS X 程序检测在 iOS 中接收到的特定通知类型。我尝试在我的 Mac 上浏览 ANCS 设备,但它没有显示出来。我知道您不能在 iOS 设备之间执行此操作,所以我想知道 iOS 和 OS X 之间是否也是如此? 谢谢!
【问题讨论】:
我知道您可以使用此服务让智能手表等设备拦截来自 iOS 设备的通知。但是你能通过 OS X 在 Mac 上接收这些 iOS 通知吗?
我希望能够让我的 OS X 程序检测在 iOS 中接收到的特定通知类型。我尝试在我的 Mac 上浏览 ANCS 设备,但它没有显示出来。我知道您不能在 iOS 设备之间执行此操作,所以我想知道 iOS 和 OS X 之间是否也是如此? 谢谢!
【问题讨论】:
绝对有可能!
这是你需要的:
CoreBluetooth 并使用 CBPeripheralManager 来宣传具有一些自定义 UUID(不是 ANCS UUID,它不会工作)的虚拟服务。您的 Mac 需要此虚拟服务才能“查看”ANCS 服务。*Mac 上的应用程序导入 IOBluetooth,启动 CBCentralManager 对象并开始扫描。你可以这样做:
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:YOUR_CUSTOM_SERVICE_UUID]] options:@{CBCentralManagerScanOptionSolicitedServiceUUIDsKey:@[[CBUUID UUIDWithString:ANCS_SERVICE_UUID]]];
确保您将自己设置为CBCentralManager 的代理以接收代理回调。
当您的 Mac 在didDiscoverPeripheral 中发现您的设备时,连接到它:
[self.centralManager connectPeripheral:peripheral options:nil];
这里要注意的非常重要的一点是,如果您希望连接到某个属性,则需要将外围设备保留到它,否则它将被释放。有关更详细的讨论,请参阅 this answer。
在didConnectPeripheral 中,您需要将自己设置为您所连接的CBPeripheral 的代理,然后开始发现服务:
[peripheral discoverServices:nil];
(从现在开始的所有回调都是针对CBPeripheral)
在didDiscoverServices 中,您应该获得可用服务的列表。如此循环它们并发现每个服务的特征:
for (CBService *service in peripheral.services) {
if ([service.UUID isEqual:[CBUUID UUIDWithString:YOUR_CUSTOM_SERVICE_UUID]]) {
NSLog(@"Found your Custom Service");
}
if ([service.UUID isEqual:[CBUUID UUIDWithString:ANCS_UUID]]) {
NSLog(@"Found ANCS Service");
}
[peripheral discoverCharacteristics:nil forService:service];
}
在didDiscoverCharacteristicsForService 中,您要查找 3 个特征:
9FBF120D-6301-42D9-8C58-25E699A21DBD(可通知)69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9(可写响应)22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB(通知)对于那些需要通知的特征,订阅它们以获取更新:
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:ANCS_CHARACTERISTIC_UUID]]) {
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
如果您想检查这些特征是否已开始通知,请在didUpdateNotificationStateForCharacteristic 中执行if(characteristic.isNotifying)。
您将在didUpdateValueForCharacteristic 和characteristic.value 中获得实际的NSData 更新。这里要注意的重要一点是,通知源特性会通知您通知事件,但这些不会包含那么多信息。如果您希望 Mac 为每个 iOS 通知播放声音或闪烁一些 Hue 灯或类似的东西,这就足够了。但是,对于实际的通知details,它需要来自数据源特性,但您需要通过对控制点特性进行非常具体的调用来请求它们。这才是真正复杂的地方,您可以在官方ANCS Specification document 获得更多信息。
如果您想要捷径或了解其他人的做法,请查看以下 Github 存储库:
请小心,因为您可能会在其中一些实现中发现错误,主要是在处理由 ANCS 数据源发送的数据时(我必须通过自己的错误处理来发挥创意)。
*** 有些人可能会争辩说,您可以使用 "Service Solicitation" 公开 ANCS,而无需在 iOS 设备上运行应用程序和/或不宣传虚拟服务(请参阅步骤 2 中的 options 参数),但我没有没有那么成功,所以也许我缺少一些东西。
【讨论】: