【问题标题】:Apple Notification Center Service through OS X通过 OS X 的 Apple 通知中心服务
【发布时间】:2014-01-06 04:07:54
【问题描述】:

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

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

【问题讨论】:

    标签: ios iphone xcode macos


    【解决方案1】:

    绝对有可能!

    这是你需要的:

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

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

    9. 如果您想要捷径或了解其他人的做法,请查看以下 Github 存储库:

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-11
      • 2018-12-15
      • 2014-01-18
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 2017-11-18
      相关资源
      最近更新 更多