我知道您可以使用此服务让智能 watch 等设备拦截来自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的委托(delegate)以接收委托(delegate)回调。
  • 当Mac在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个特征:
  • 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];
     }
    
  • 如果要检查是否已开始通知这些特征,请在if(characteristic.isNotifying)中执行didUpdateNotificationStateForCharacteristic
  • 您将使用NSDatadidUpdateValueForCharacteristic中获取实际的characteristic.value更新。这里要注意的重要事情是,您将通过Notification Source特性来通知通知事件,但是这些事件不会包含那么多信息。如果您想让Mac播放声音或闪烁某些Hue灯或类似的声音,则每个iOS通知就足够了。但是,对于实际的通知详细信息,它将需要来自“数据源”特征,但是您需要通过对“控制点”特征进行非常特定的调用来请求它们。这是非常复杂的地方,您将可以在官方的ANCS Specification document中获得更多信息。
  • 如果您需要快捷方式或看看其他人是如何做到的,请查看以下Github存储库:
  • jamiepinkham/BTLE_ANCS
  • KhaosT/ANCS-Mac
  • indragiek/INDANCSClient

  • 请小心,因为您可能会在其中一些实现中发现错误,主要是在处理ANCS数据源发送的数据时(我必须借助自己的错误处理来发挥创造力)。
    ***有人可能会争辩说,您可以使用"Service Solicitation"公开ANCS,而无需在iOS设备上运行应用程序和/或无需宣传虚拟服务(请参阅步骤2中的options参数),但是我在此方面没有获得太大的成功所以也许有一些我想念的东西。

    关于ios - 通过OS X的Apple Notification Center服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20650366/

    10-11 19:56