在iOS7下,主要ANCS服务是否意味着要不断地进行广告宣传,或者是否需要在模糊设置中启用它/使用自定义CBPeripheralManager (使用苹果指定的服务和特性UUID)来成功地发现和订阅通知消费者?
令人惊讶的是,苹果的文档( CoreBluetooth Programming Guide和ANCS 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:
// 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];发布于 2013-11-14 02:28:49
作为对这个问题的一个迟来的回答,现在小牛队出局了,下面是我们想出的。
我们最初在两个iOS设备之间实现ANCS规范的努力失败了,其中一个是外围设备,另一个是中央设备。过了一段时间,苹果回复了我们(向他们的传道人致敬),并告诉我们这是不可能的。
随着CBPeripheralManager类和CBPeripheralManagerDelegate协议的加入,嵌入在OSX上的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设备上的一个iOS:
- (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。
<CBCentralManager: 0x14e23280> <CBPeripheral: 0x14d27b40 identifier = 7231B80F-874E-DB5F-2AF9-7F376911E2B7, Name = "ANCS", state = disconnected> {
kCBAdvDataChannel = 39;
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = ANCS;
} -60快乐狩猎
发布于 2013-10-09 17:00:49
因为您将广告数据字典的UUID设置为字符串,而不是CBUUID,所以我认为key接受一个CBUUID数组。
因此,这应使其发挥作用:
NSDictionary *advertisementData = @{
CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"]],
CBAdvertisementDataLocalNameKey:@"ANCS",
};编辑:哦,是的,我的错!我忘了提到,如果您试图从另一个iOS设备上发现ANCS服务,您将无法看到它,而不是在iOS 7下。不知何故,操作系统正在为自己保留该服务,即使您可能在广告数据上看到它,也不会在您的didDiscoverServices回调中出现。但是,如果您有一个外部设备,比如一个非iOS设备,或者一个类似鹅卵石的设备,它就可以工作。这是您公开ANCS功能的方式,但是实现的其余部分取决于服务的使用者。
发布于 2013-10-15 07:01:25
根据这篇博文:
http://blog.punchthrough.com/post/63658238857/the-apple-notification-center-service-or-wtf-is
您可以通过“服务征求”广告对ANCS进行配对和访问,而无需在iPhone上编写任何代码!
我还没有试过,但很快就会试的。
https://stackoverflow.com/questions/19118699
复制相似问题