8

在 iOS7 下,主要的 ANCS 服务是要不断宣传的,还是需要在模糊设置中启用/使用自定义 CBPeripheralManager(使用 Apple 指定的服务和特征 UUID)实现,以便潜在的通知消费者成功发现它并订阅?

Apple 文档(CoreBluetooth 编程指南ANCS 规范)出人意料地没有关于这方面的任何信息。他们似乎暗示需要自定义实现,但这只是我们的推测。

给定主要的 ANCS 服务 UUID: 7905F431-B5CE-4E99-A40F-4B1E122D00D0,执行扫描不会产生任何命中。正如预期的那样,扫描整个 BLE 频谱会产生对其他 BLE 设备的命中,但不会对单个 ANCS 设备产生命中。

编辑 1

定义自定义 CBPeripheralManager 并手动添加 Apple 指定的 ANCS 服务及其相关特性失败,并出现 NSError:Error Domain=CBErrorDomain Code=8 "The specified UUID is not allowed for this operation."

因此,服务 UUID 似乎是由 Apple 保留的(应该如此),我们无法以这种方式启用它。

非常感谢任何见解;我们已经就此与 Apple 联系,并会在收到他们的消息后进行更新。

下面的代码重现了上面提到的 NSError:

// define the ANCS Characteristics
CBUUID *notificationSourceUUID = [CBUUID UUIDWithString:@"9FBF120D-6301-42D9-8C58-25E699A21DBD"];
CBMutableCharacteristic *notificationSource = [[CBMutableCharacteristic alloc] initWithType:notificationSourceUUID properties:CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
CBUUID *controlPointUUID = [CBUUID UUIDWithString:@"69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9"];
CBMutableCharacteristic *controlPoint = [[CBMutableCharacteristic alloc] initWithType:controlPointUUID properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteEncryptionRequired];
CBUUID *dataSourceUUID = [CBUUID UUIDWithString:@"22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB"];
CBMutableCharacteristic *dataSource = [[CBMutableCharacteristic alloc] initWithType:dataSourceUUID properties:CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];

// define the ANCS Service
CBUUID *ANCSUUID = [CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"];
CBMutableService *ANCS = [[CBMutableService alloc] initWithType:ANCSUUID primary:YES];
ANCS.characteristics = @[notificationSource, controlPoint, dataSource];

// define the Advertisement data
NSMutableDictionary *advertisementData = [NSMutableDictionary dictionary];
[advertisementData setValue:@"CUSTOM_ANCS" forKey:CBAdvertisementDataLocalNameKey];
[advertisementData setValue:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0" forKey:CBAdvertisementDataServiceUUIDsKey];

// publish the ANCS service
[self.peripheralManager addService:ANCS];
4

6 回答 6

6

作为这个问题的迟来的答案,现在小牛队已经出局了,这就是我们想出的。

我们最初在两台 iOS 设备(一台作为外围设备,一台作为中央设备)之间实施 ANCS 规范的努力没有成功。一段时间后,Apple 回复了我们(向他们的布道者致敬)并告诉我们这是不可能的。

通过将 CBPeripheralManager 类和 CBPeripheralManagerDelegate 协议添加到 OSX Mavericks 上的 IOBluetooth.framework 中嵌入的 CoreBluetooth.framework(深呼吸),我们现在可以在 OSX 设备上使用 BLE 无线电来实现和宣传 ANCS。

因此,这个片段属于 OSX 上的 CBPeripheralManager:

- (void) advertiseANCS
{
    NSLog(@"%s", __FUNCTION__);

    // define the ANCS Characteristics
    CBUUID *notificationSourceUUID = [CBUUID UUIDWithString:@"9FBF120D-6301-42D9-8C58-25E699A21DBD"];
    CBMutableCharacteristic *notificationSource = [[CBMutableCharacteristic alloc] initWithType:notificationSourceUUID properties:CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
    CBUUID *controlPointUUID = [CBUUID UUIDWithString:@"69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9"];
    CBMutableCharacteristic *controlPoint = [[CBMutableCharacteristic alloc] initWithType:controlPointUUID properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteEncryptionRequired];
    CBUUID *dataSourceUUID = [CBUUID UUIDWithString:@"22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB"];
    CBMutableCharacteristic *dataSource = [[CBMutableCharacteristic alloc] initWithType:dataSourceUUID properties:CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];

    // define the ANCS Service
    CBUUID *ANCSUUID = [CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"];
    CBMutableService *ANCS = [[CBMutableService alloc] initWithType:ANCSUUID primary:YES];
    ANCS.characteristics = @[notificationSource, controlPoint, dataSource];

    // define the Advertisement data
    NSMutableDictionary *advertisementData = [NSMutableDictionary dictionary];
    [advertisementData setValue:@"ANCS" forKey:CBAdvertisementDataLocalNameKey];
    [advertisementData setValue:@[ANCSUUID] forKey:CBAdvertisementDataServiceUUIDsKey];

    // publish the ANCS service
    [self.peripheralManager addService:ANCS];
    [self.peripheralManager startAdvertising:advertisementData];
}

而此代码段属于 iOS 设备上的 CBCentralManager:

- (void) discoverANCS
{
    NSLog(@"%s", __FUNCTION__);

    NSMutableArray *services = [NSMutableArray array];
    [services addObject:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"];

    NSMutableDictionary *options = [NSMutableDictionary dictionary];
    [options setValue:[NSNumber numberWithBool:NO] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];

    [self.centralManager scanForPeripheralsWithServices:services options:options];
}

iOS 设备现在可以看到并连接到 OSX 无线电,该无线电实现了 Apple 文档中详述的 ANCS 规范。

<CBCentralManager: 0x14e23280> <CBPeripheral: 0x14d27b40 identifier = 7231B80F-874E-DB5F-2AF9-7F376911E2B7, Name = "ANCS", state = disconnected> {
    kCBAdvDataChannel = 39;
    kCBAdvDataIsConnectable = 1;
    kCBAdvDataLocalName = ANCS;
} -60

快乐狩猎

于 2013-11-14T02:28:49.940 回答
2

原因是因为您将广告数据字典的 UUID 设置为字符串而不是 CBUUID,而且我认为该键需要一个 CBUUID 数组。

因此这应该使它起作用:

NSDictionary *advertisementData = @{
                                        CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"]],
                                        CBAdvertisementDataLocalNameKey:@"ANCS",
                                        };

编辑:哦,是的,我的错!我忘了提到,如果您试图从另一台 iOS 设备上发现此 ANCS 服务,您将无法看到它,而不是在 iOS 7 下。操作系统以某种方式将该服务保留给自己,并且不会出现在您的 didDiscoverServices 回调中,即使您可能会在您的广告数据中看到它。但是,如果您有外部设备(如非 iOS 设备或类似 pebble 的设备),它将起作用。这是您公开 ANCS 功能的方式,但实现的其余部分取决于服务的使用者。

于 2013-10-09T17:00:49.753 回答
2

根据这篇博文:

http://blog.punchthrough.com/post/63658238857/the-apple-notification-center-service-or-wtf-is

您无需在 iPhone 上编写任何代码即可通过“服务请求”进行广告配对和访问 ANCS!

我还没有尝试过,但很快就会。

于 2013-10-15T07:01:25.547 回答
2

对于目前在谷歌上搜索类似问题的任何人:通过 CoreBluetooth 的 ANCS 似乎不再适用于 iOS 9。具体来说,

此功能已从 OS X 和 iOS 中删除。

这两个平台都不能再使用 CoreBluetooth 来使用 ANCS 服务。

https://forums.developer.apple.com/thread/24336提供

于 2016-03-02T04:29:32.677 回答
1

ANCS在iOS上没有做广告,我用下面的方式实现了与ANCS的长时间连接:

我的外围设备使用广告中的虚拟服务。iOS 应用程序用于发现具有此服务的设备并创建连接。您可以编写自己的应用程序,或使用免费的应用程序之一(例如 LightBlue)。

建立连接后,外围设备会枚举连接的 iOS 设备上存在的所有服务。除了其他之外,还有 ANCS 文档中提到的这三个。

如果您为他们注册通知,您将获得 ANCS 数据。

如果您绑定设备(iOS 和外围设备),ANCS 将在任何时候自动关注连接(重新)建立,如果它发现绑定的设备正在广告中。

于 2014-04-28T12:26:23.893 回答
0

我在 iPhone 上使用 ANCS,没有任何代码,使用“类似卵石”的原型硬件。在这个问题上使用上面记录的方法。该视频是一种笑话节目,就像“区域通知”的概念一样,是一个笑话:-),根本不是技术性的。但可能会提供一些信息。

http://www.youtube.com/watch?v=O-YWMl7IS-g

我不从我的 youtube 上赚钱 BTW

我在 iOS 上没有成功——iOS 的尝试。

于 2013-11-21T15:56:33.173 回答