我知道您可以使用此服务让智能手表等设备拦截来自iOS设备的通知。但是你可以通过OS X在Mac上收到这些iOS通知吗?
我希望能够让我的OS X程序检测到iOS中收到的特定通知类型。我尝试在我的Mac上浏览ANCS设备,但它没有显示出来。我知道你不能在iOS设备之间这样做,所以我想知道iOS和OS X之间是否也是如此? 谢谢!
答案 0 :(得分:9)
绝对有可能!
以下是您的需求:
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];
}
如果您想检查这些特征是否已开始通知,请在if(characteristic.isNotifying)
中执行didUpdateNotificationStateForCharacteristic
。
您将NSData
与didUpdateValueForCharacteristic
获得实际characteristic.value
次更新。这里需要注意的重要一点是,您将通知Notification Source特性的通知事件,但这些信息不会包含太多信息。如果您希望Mac播放声音或为每个iOS通知闪现一些Hue灯或类似的东西,这就足够了。但是,对于实际通知详细信息,它需要来自数据源特性,但您需要通过对控制点特性进行非常具体的调用来请求它们。这是非常复杂的地方,您将能够在官方ANCS Specification document获得更多信息。
如果您想要快捷方式或查看其他人如何做到这一点,请查看这些Github回购:
请注意,因为您可能会发现其中一些实施中的错误,主要是处理ANCS数据源发送的数据(我必须通过自己的错误处理获得创意)。
***有些人可能会争辩说,您可以使用"Service Solicitation"公开ANCS,而无需在iOS设备上运行应用和/或不宣传虚拟服务(请参阅步骤2中的options
参数)但是我没有取得那么大的成功,所以也许有些东西我不知道。