Я работаю над приложением для iPhone и Mac OS X, которое позволяет блокировать и разблокировать Mac с расстояния. Означает, что если уровень сигнала ниже определенного порога или соединение потеряно, он заблокирует Mac.

Я работаю с Apple CoreBluetooth framework для BTLE, используя iPhone в качестве периферийного устройства и Mac в качестве центрального. Все идет нормально. Он также работает очень хорошо, но когда я отправляю приложение в фоновый режим на iPhone, кажется, что реклама меняется. IPhone все еще рекламируется, но без профиля обслуживания и характеристик, которые я использую в приложении. Хотя это не проблема, когда iPhone все еще находится в зоне действия Mac, поскольку он все еще подключен и характеристики не используются в центральном устройстве, это становится проблемой после перемещения iPhone за пределы диапазона. Как и ожидалось, Mac блокируется и начинает обнаруживать, чтобы повторно подключить iPhone и разблокировать в случае успеха.

Но в этом обнаружении я использую указанный профиль службы и характеристики только для получения устройств, на которых запущено мое приложение, и для определения того, которое нужно разблокировать.

Я попробовал обходной путь, обнаружив без профиля службы и определив правильное устройство по его UUID, который я сохранил, когда начал использовать этот iPhone для блокировки и разблокировки. Этот обходной путь также работает в небольшом объеме, потому что, когда я выключаю Bluetooth на iPhone и включаю его снова, он получает другой UUID. Это ограничение, с которым я мог бы жить, но оно также меняет UUID через несколько часов, и тогда разблокировка не работает.

Может, кто-то уже работал над подобным приложением и знает, как исправить такую ​​проблему? Или вы знаете статическое значение, которое я могу использовать для идентификации устройства?

6
kober 21 Июн 2013 в 18:56

1 ответ

Лучший ответ

Кажется, что, как обычно, у Apple в своей структуре происходят странные и уникальные вещи. Когда вы размещаете рекламу с устройства iOS (например, вашего iPhone), есть две «области хранения» для рекламы - обычная, которую может видеть любое сканируемое устройство, и «переполненная», которую могут видеть только Устройства iOS, которые специально сканируют его. Когда ваше приложение рекламируется в фоновом режиме, все UUID сервисов, которые вы рекламируете, к сожалению, попадают в эту область переполнения, поэтому похоже, что это могут видеть только другие устройства iOS, а не ваш Mac. Из документации CBPeripheralManager:

Любые универсальные уникальные идентификаторы службы (UUID), содержащиеся в значении ключа CBAdvertiseDataServiceUUIDsKey, которые не помещаются в выделенное пространство, добавляются в специальную область «переполнения»; они могут быть обнаружены только устройством iOS, которое явно сканирует их. Пока ваше приложение работает в фоновом режиме, локальное имя не объявляется, и все UUID службы помещаются в область переполнения.

5
Matthew Griffin 22 Июн 2013 в 00:09