iOS 7 ANCS: обнаружение основного UUID службы ANCS

Под iOS7 - это основная служба ANCS, предназначенная для постоянной рекламы, или ее необходимо включить в запутанных настройках / внедрить с использованием настраиваемого CBPeripheralManager (с использованием идентификатора UUID службы и характеристики Apple) для потенциального потребителя уведомлений, чтобы успешно обнаружить его и подписаться?

Документация Apple (и руководство по программированию CoreBluetooth, и спецификация ANCS) неожиданно лишены какой-либо информации по этому вопросу. Кажется, они намекают на необходимость индивидуальной реализации, но это только догадка с нашей стороны.

Учитывая первичный UUID службы ANCS: 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];

6 ответов

Решение

Как запоздалый ответ на этот вопрос, теперь, когда Маверикс отсутствует, вот что мы придумали.

Наши первоначальные усилия по внедрению спецификации ANCS между двумя устройствами iOS, одним из которых было периферийным, а другим - центральным, оказались безуспешными. Через некоторое время Apple отреагировала на нас (отзыв своим евангелистом) и сказала, что это невозможно.

С добавлением класса CBPeripheralManager и протокола CBPeripheralManagerDelegate к CoreBluetooth.framework, встроенному в IOBluetooth.framework на OSX Mavericks (глубокий вдох), теперь мы можем использовать радио BLE на устройстве OSX для реализации и рекламы ANCS.

Таким образом, этот фрагмент принадлежит CBPeripheralManager на OSX:

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

Принимая во внимание, что этот фрагмент принадлежит к CBCentralManager на устройстве 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

Хорошей охоты

Ну, причина в том, что вы устанавливаете UUID для рекламного словаря данных как строку, а не как CBUUID, также я думаю, что ключ принимает массив CBUUID.

поэтому это должно заставить его работать:

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

РЕДАКТИРОВАТЬ: Ах да, мой плохой! Я забыл упомянуть, что если вы пытаетесь обнаружить этот сервис ANCS с другого устройства iOS, вы не сможете его увидеть, не под iOS 7. Каким-то образом ОС резервирует этот сервис для себя и не будет отображаться при обратном вызове didDiscoverServices, даже если Вы могли бы видеть это на своих рекламных данных. Тем не менее, он будет работать, если у вас есть внешнее устройство, такое как устройство, отличное от iOS, или устройство, подобное гальке. Вот как вы предоставляете функциональность ANCS, но остальная часть реализации зависит от потребителя сервиса.

Для тех, кто в настоящее время гуглит подобный вопрос: ANCS через CoreBluetooth, похоже, больше не работает в iOS 9. В частности,

Эта функциональность была удалена из OS X и iOS.

Ни одна из платформ больше не может использоваться для использования сервиса ANCS с использованием CoreBluetooth.

Предоставлено https://forums.developer.apple.com/thread/24336

Согласно этому сообщению в блоге:

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

Вы можете рекламировать с помощью "запроса услуг" для сопряжения и доступа к ANCS без написания какого-либо кода на iPhone!

Я не пробовал, но скоро буду.

ANCS не объявляется на iOS, я использовал следующий способ для установления долгосрочного соединения с ANCS:

Мое периферийное устройство использует фиктивный сервис, который рекламируется. Приложение iOS используется для обнаружения устройства с этой услугой и создания соединения. Вы можете написать свое собственное приложение или использовать одно из бесплатных (например, LightBlue).

Как только соединение установлено, периферийное устройство перечисляет все сервисы, присутствующие на подключенном устройстве iOS. Помимо других, эти три упомянуты в документации ANCS.

Если ваш регистр уведомит их, вы получите данные ANCS.

Если вы связываете устройства (iOS и периферийные устройства), ANCS будет автоматически заботиться о восстановлении соединения в любое время, если обнаружит, что связанное устройство рекламируется.

Я использую ANCS без какого-либо кода на iPhone, используя "подобный камешкам" аппаратный прототип. Используя методы, задокументированные выше по этому вопросу. Видео предназначено для своего рода шутливого шоу и задумано как шутка, так же как и концепция "уведомлений по всей области":-), а вовсе не техническая. Но может быть несколько информативным.

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

Я не зарабатываю деньги на моем YouTube Кстати

У меня не получилось с iOS- попытки iOS.

Другие вопросы по тегам