iOS: обнаруживать пользователей приложения поблизости

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

  1. Используйте Bluetooth, чтобы периодически проверять, есть ли в радиусе действия устройство с моим приложением. Отправить список найденных устройств на сервер. Проблема здесь в расходе батареи. Правда ли, что через некоторое время Bluetooth будет отключен автоматически?

  2. Могу ли я использовать технологию BLE для этой цели? Если да, то знаете ли вы, какие устройства поддерживают BLE?

Какой на ваш взгляд лучший вариант? Я пропустил какой-то другой вариант?

Спасибо

ОБНОВЛЕНИЕ Я планирую запускать поиск каждые 20 секунд или даже чаще.


person Pavel Podlipensky    schedule 23.01.2014    source источник
comment
Обратите внимание, что то, о чем вы говорите, работает только для поиска ближайших устройств, на которых на самом деле запущено ваше приложение на переднем плане, а не только для поиска других устройств.   -  person rmaddy    schedule 24.01.2014
comment
@rmaddy, я знаю. Это именно то, что мне нужно.   -  person Pavel Podlipensky    schedule 24.01.2014


Ответы (2)


На эту проблему нет простого ответа.

Bluetooth имеет 2 варианта: «обычный» Bluetooth, используемый для устройств громкой связи, наушников и т. п., и BLE (Bluetooth с низким энергопотреблением).

Обычные устройства Bluetooth должны быть сопряжены. (Я менее знаком с обычным bluetooth, чем с BLE, поэтому отнеситесь к моему объяснению этого бита с долей скептицизма.) Чтобы быть в паре, они должны быть переведены в «обнаруживаемый» режим, который транслирует их идентификатор. Это разряжает батарею и делается ненадолго. Это не «всегда включенное» решение.

BLE имеет диапазон до 60 метров, поэтому он должен удовлетворить ваши потребности в этом отношении.

Устройства BLE могут «рекламироваться» как «периферийные устройства» в течение длительного времени. Другие устройства Bluetooth могут действовать как «центральные» и запрашивать уведомление при обнаружении определенных периферийных устройств. Я не уверен, можно ли заставить устройство iOS рекламироваться (транслироваться) как периферийное устройство BLE, когда оно находится в фоновом режиме и/или если устройство заблокировано, но оно, безусловно, будет рекламироваться во время работы. Я почти уверен, что вы можете зарегистрироваться, чтобы получать уведомления, когда вы обнаружите определенное периферийное устройство BLE в фоновом режиме, но не положительно.

iBeacons — это особое использование BLE с некоторыми дополнительными ограничениями и некоторыми дополнительными возможностями. iBeacon — это очень простой передатчик, который периодически (обычно раз в секунду) отправляет UUID плюс основное и вспомогательное значение, а также значение калибровки мощности сигнала. Вы не можете добавлять какие-либо другие данные к передаче iBeacon. iOS может действовать как передатчик iBeacon только тогда, когда приложение находится на переднем плане. Если ваше приложение переходит в фоновый режим, оно прекращает передачу. Период.

Однако вы можете прослушивать сигналы iBeacon даже в фоновом режиме. И, если вы зарегистрировались в качестве прослушивателя iBeacon, и система завершает работу вашего приложения из-за нехватки памяти, система по-прежнему прослушивает эти маяки от вашего имени. Если iOS обнаружит маяк, который вы слушаете, вы будете перезапущены, если это необходимо, и получите уведомление в фоновом режиме. Затем вы можете опубликовать локальное уведомление, чтобы привлечь внимание пользователя.

iBeacons, вероятно, ваш лучший выбор, но вам нужно, чтобы ваши пользователи активно запускали ваше приложение на переднем плане для передачи сигнала. Это довольно быстро разрядит батарею вашего пользователя.

person Duncan C    schedule 24.01.2014
comment
Спасибо за отличное объяснение. Но представьте, что все мои пользователи будут постоянно прослушивать iBeacons (по умолчанию). И как только один из них решит отправить некоторые данные другим, он вытащит приложение на передний план и сделает себя передатчиком iBeacon. Будут ли тогда другие уведомлены о появлении пользователя? Или другие должны слушать конкретный iBeacon (т.е. заранее знать о пользователе с приложением переднего плана)? - person Pavel Podlipensky; 24.01.2014
comment
Вы должны слушать определенные маяки. Вы можете прослушивать определенный UUID, не указывать основные или второстепенные значения и запрашивать обновления диапазона. Когда вы перейдете от обнаружения отсутствия маяков к обнаружению одного или нескольких, вы получите несколько секунд звонков с информацией обо всех маяках в пределах досягаемости. Если вы переключитесь на передний план, вы сможете продолжить поиск и получите информацию обо всех маяках. Вы можете сделать так, чтобы каждый пользователь использовал разные основные и второстепенные значения в качестве своих идентификаторов пользователей (2 16-битных значения или около 4 миллиардов уникальных идентификаторов). - person Duncan C; 24.01.2014

Одним из возможных решений было бы, чтобы каждое отдельное устройство отправляло свое местоположение на ваш сервер каждый заданный период времени (чем чаще, тем лучше, но более ресурсоемко). Затем запросите данные с сервера и получите местоположение всех устройств рядом с вами.

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

Используйте эту опцию, если вы хотите получать данные каждые 15-20 минут или около того.

person Programmer    schedule 23.01.2014
comment
Считаете ли вы, что отправка геолокации каждые 20 секунд на сервер будет дешевле, чем отслеживание BLE-устройств поблизости каждые 20 секунд? Как насчет проверки устройств Bluetooth каждые 20 секунд? - person Pavel Podlipensky; 24.01.2014
comment
Каждые 20 секунд? Нет, не отправлять данные на сервер. Я не знаю, имеет ли BLE или обычный Bluetooth диапазон более 50 футов. - person Programmer; 24.01.2014