我知道你可以使用这项服务让智能手表等设备拦截iOS设备的通知。但是你能通过OS X在Mac上接收这些iOS通知吗?
我希望能够让我的OS X程序检测到在iOS中接收到的特定通知类型。我试着在Mac上浏览ANCS设备,但它没有出现。我知道你不能在iOS设备之间这样做,所以我想知道iOS和OS X之间是否也是如此?谢谢
这绝对有可能!
以下是您需要的:
- iOS设备上的一个应用程序,它导入
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];
这里需要注意的一件非常重要的事情是,如果你想连接到一处房产,你需要保留你的外围设备,否则它将被解除锁定。有关更详细的讨论,请参阅此答案。
-
在
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个特征:- ANCS通知源:UUID
9FBF120D-6301-42D9-8C58-25E699A21DBD
(可通知) - ANCS控制点:UUID
69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9
(可写,带响应) - ANCS数据源:UUID
22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB
(可通知)
对于那些应通知的特征,订阅它们进行更新:
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:ANCS_CHARACTERISTIC_UUID]]) { [peripheral setNotifyValue:YES forCharacteristic:characteristic]; }
- ANCS通知源:UUID
-
如果要检查这些特性是否已开始通知,请在
didUpdateNotificationStateForCharacteristic
中执行if(characteristic.isNotifying)
。 -
您将使用
characteristic.value
在didUpdateValueForCharacteristic
中获得实际的NSData
更新。这里需要注意的重要一点是,您将通过通知源特性了解通知事件,但这些事件不会包含那么多信息。如果你想让你的Mac为每个iOS通知播放声音或闪烁一些Hue灯或类似的东西,这就足够了。但是,对于实际通知详细信息,它需要来自数据源特性,但您需要通过对控制点特性进行非常具体的调用来请求它们。这就是它变得非常复杂的地方,您可以在官方的ANCS规范文档中获得更多信息。 -
如果你想要一个快捷方式或看看其他人是如何做到的,请查看以下Github repos:
- jamiepinkham/BTLE_ANCS
- KhaosT/ANCS Mac
- indragiek/INDANCSClient
请小心,因为您可能会在其中一些实现中发现错误,主要是在处理ANCS数据源发送的数据时(我必须在自己的错误处理方面发挥创意)。
***有些人可能会争辩说,你可以使用"服务请求"来公开ANCS,而无需在iOS设备上运行应用程序和/或广告虚假服务(请参阅步骤2中的options
参数),但我在这方面没有取得太大成功,所以可能我缺少了一些东西。