我知道您可以使用此服务让智能 watch 等设备拦截来自iOS设备的通知。但是,您可以通过OS X在Mac上接收这些iOS通知吗?
我希望我的OS X程序能够检测到iOS收到的特定通知类型。我尝试在Mac上浏览ANCS设备,但未显示。我知道您无法在iOS设备之间执行此操作,因此我想知道在iOS和OS X之间是否也是如此?
谢谢!
最佳答案
绝对有可能!
这是您需要的:
CoreBluetooth
并使用CBPeripheralManager
来播发具有某些自定义UUID(不是ANCS UUID的虚拟服务)的虚拟服务。 Mac要“查看” ANCS服务,需要此虚拟服务。* IOBluetooth
,启动CBCentralManager
对象并开始扫描。您可以这样做:[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:YOUR_CUSTOM_SERVICE_UUID]] options:@{CBCentralManagerScanOptionSolicitedServiceUUIDsKey:@[[CBUUID UUIDWithString:ANCS_SERVICE_UUID]]];
确保将自己设置为
CBCentralManager
的委托(delegate)以接收委托(delegate)回调。 didDiscoverPeripheral
中找到您的设备时,请连接至该设备:[self.centralManager connectPeripheral:peripheral options:nil];
这里要注意的一件非常重要的事情是,如果您希望连接到某个属性,则需要保留该外围设备,否则它将被取消分配。有关更多详细讨论,请参见this answer。
didConnectPeripheral
中,您需要将自己设置为所连接的CBPeripheral
的委托(delegate),然后才能开始发现服务:[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播放声音或闪烁某些Hue灯或类似的声音,则每个iOS通知就足够了。但是,对于实际的通知详细信息,它将需要来自“数据源”特征,但是您需要通过对“控制点”特征进行非常特定的调用来请求它们。这是非常复杂的地方,您将可以在官方的ANCS Specification document中获得更多信息。 请小心,因为您可能会在其中一些实现中发现错误,主要是在处理ANCS数据源发送的数据时(我必须借助自己的错误处理来发挥创造力)。
***有人可能会争辩说,您可以使用"Service Solicitation"公开ANCS,而无需在iOS设备上运行应用程序和/或无需宣传虚拟服务(请参阅步骤2中的
options
参数),但是我在此方面没有获得太大的成功所以也许有一些我想念的东西。关于ios - 通过OS X的Apple Notification Center服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20650366/