通过OS X的Apple通知中心服务



我知道你可以使用这项服务让智能手表等设备拦截iOS设备的通知。但是你能通过OS X在Mac上接收这些iOS通知吗?

我希望能够让我的OS X程序检测到在iOS中接收到的特定通知类型。我试着在Mac上浏览ANCS设备,但它没有出现。我知道你不能在iOS设备之间这样做,所以我想知道iOS和OS X之间是否也是如此?谢谢

这绝对有可能!

以下是您需要的:

  1. iOS设备上的一个应用程序,它导入CoreBluetooth并使用CBPeripheralManager来宣传带有一些自定义UUID的虚拟服务(不是ANCS UUID,它不起作用)。此虚拟服务是Mac"查看"ANCS服务所必需的*
  2. Mac上导入IOBluetooth、启动CBCentralManager对象并启动扫描的应用程序。你可以这样做:

    [self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:YOUR_CUSTOM_SERVICE_UUID]] options:@{CBCentralManagerScanOptionSolicitedServiceUUIDsKey:@[[CBUUID UUIDWithString:ANCS_SERVICE_UUID]]];
    

    确保您将自己设置为CBCentralManager的代表,以接收代表回调。

  3. 当您的Mac在didDiscoverPeripheral中发现您的设备时,请连接到它:[self.centralManager connectPeripheral:peripheral options:nil];

    这里需要注意的一件非常重要的事情是,如果你想连接到一处房产,你需要保留你的外围设备,否则它将被解除锁定。有关更详细的讨论,请参阅此答案。

  4. didConnectPeripheral中,您需要将自己设置为连接到的CBPeripheral的代理,然后开始发现服务:

    [peripheral discoverServices:nil];

    (从这一点开始的所有回调都是针对CBPeripheral的)

  5. 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];
    }
    
  6. 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];
     }
    
  7. 如果要检查这些特性是否已开始通知,请在didUpdateNotificationStateForCharacteristic中执行if(characteristic.isNotifying)

  8. 您将使用characteristic.valuedidUpdateValueForCharacteristic中获得实际的NSData更新。这里需要注意的重要一点是,您将通过通知源特性了解通知事件,但这些事件不会包含那么多信息。如果你想让你的Mac为每个iOS通知播放声音或闪烁一些Hue灯或类似的东西,这就足够了。但是,对于实际通知详细信息,它需要来自数据源特性,但您需要通过对控制点特性进行非常具体的调用来请求它们。这就是它变得非常复杂的地方,您可以在官方的ANCS规范文档中获得更多信息。

  9. 如果你想要一个快捷方式或看看其他人是如何做到的,请查看以下Github repos:

    • jamiepinkham/BTLE_ANCS
    • KhaosT/ANCS Mac
    • indragiek/INDANCSClient

    请小心,因为您可能会在其中一些实现中发现错误,主要是在处理ANCS数据源发送的数据时(我必须在自己的错误处理方面发挥创意)。

***有些人可能会争辩说,你可以使用"服务请求"来公开ANCS,而无需在iOS设备上运行应用程序和/或广告虚假服务(请参阅步骤2中的options参数),但我在这方面没有取得太大成功,所以可能我缺少了一些东西。

最新更新