首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 7 ANCS:发现主ANCS服务UUID

iOS 7 ANCS:发现主ANCS服务UUID
EN

Stack Overflow用户
提问于 2013-10-01 14:20:56
回答 6查看 7.3K关注 0票数 8

在iOS7下,主要ANCS服务是否意味着要不断地进行广告宣传,或者是否需要在模糊设置中启用它/使用自定义CBPeripheralManager (使用苹果指定的服务和特性UUID)来成功地发现和订阅通知消费者?

令人惊讶的是,苹果的文档( CoreBluetooth Programming GuideANCS Specification)都没有这方面的任何信息。它们似乎暗示需要自定义实现,但这只是我们的猜测。

给定主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 (应该保留的)保留的,我们不能以这种方式启用它。

任何洞察力都会受到极大的赞赏;我们已经就此事与苹果进行了接触,并将在收到他们的消息后进行更新。

下面的代码复制了上面提到的NSError:

代码语言:javascript
复制
// 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];
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-11-14 02:28:49

作为对这个问题的一个迟来的回答,现在小牛队出局了,下面是我们想出的。

我们最初在两个iOS设备之间实现ANCS规范的努力失败了,其中一个是外围设备,另一个是中央设备。过了一段时间,苹果回复了我们(向他们的传道人致敬),并告诉我们这是不可能的。

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

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

代码语言:javascript
复制
- (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设备上的一个iOS:

代码语言:javascript
复制
- (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收音机,它实现了ANCS规范,详见Apple。

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

快乐狩猎

票数 6
EN

Stack Overflow用户

发布于 2013-10-09 17:00:49

因为您将广告数据字典的UUID设置为字符串,而不是CBUUID,所以我认为key接受一个CBUUID数组。

因此,这应使其发挥作用:

代码语言:javascript
复制
NSDictionary *advertisementData = @{
                                        CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"]],
                                        CBAdvertisementDataLocalNameKey:@"ANCS",
                                        };

编辑:哦,是的,我的错!我忘了提到,如果您试图从另一个iOS设备上发现ANCS服务,您将无法看到它,而不是在iOS 7下。不知何故,操作系统正在为自己保留该服务,即使您可能在广告数据上看到它,也不会在您的didDiscoverServices回调中出现。但是,如果您有一个外部设备,比如一个非iOS设备,或者一个类似鹅卵石的设备,它就可以工作。这是您公开ANCS功能的方式,但是实现的其余部分取决于服务的使用者。

票数 2
EN

Stack Overflow用户

发布于 2013-10-15 07:01:25

根据这篇博文:

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19118699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档