通过OS X的Apple Notification Center服务

时间:2013-12-18 05:33:15

标签: ios iphone xcode macos

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

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

1 个答案:

答案 0 :(得分:9)

绝对有可能!

以下是您的需求:

  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];

    这里需要注意的一件非常重要的事情是,如果您希望连接到属性,则需要将外围设备保留在属性中,否则它将被解除分配。有关更详细的讨论,请参阅this answer

  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. 如果您想检查这些特征是否已开始通知,请在if(characteristic.isNotifying)中执行didUpdateNotificationStateForCharacteristic

  8. 您将NSDatadidUpdateValueForCharacteristic获得实际characteristic.value次更新。这里需要注意的重要一点是,您将通知Notification Source特性的通知事件,但这些信息不会包含太多信息。如果您希望Mac播放声音或为每个iOS通知闪现一些Hue灯或类似的东西,这就足够了。但是,对于实际通知详细信息,它需要来自数据源特性,但您需要通过对控制点特性进行非常具体的调用来请求它们。这是非常复杂的地方,您将能够在官方ANCS Specification document获得更多信息。

  9. 如果您想要快捷方式或查看其他人如何做到这一点,请查看这些Github回购:

    请注意,因为您可能会发现其中一些实施中的错误,主要是处理ANCS数据源发送的数据(我必须通过自己的错误处理获得创意)。

  10. ***有些人可能会争辩说,您可以使用"Service Solicitation"公开ANCS,而无需在iOS设备上运行应用和/或不宣传虚拟服务(请参阅步骤2中的options参数)但是我没有取得那么大的成功,所以也许有些东西我不知道。