Введите регион iBeacon с приложением в фоновом режиме и запросите URL-адрес без уведомления

Я много искал в SO и Google, чтобы попытаться получить ответ на этот вопрос, но я не смог собрать все части головоломки вместе, поэтому любая помощь/указатели были бы отличными.

Я хотел бы создать приложение, которое проверяет веб-службу, когда она входит в регион iBeacon. Простой пример использования:

  1. пользователь заходит в магазин, оборудованный iBeacon, с приложением в фоновом режиме

  2. вместо того, чтобы уведомлять пользователя, приложение отправляет запрос на веб-сервер, чтобы проверить, является ли идентификатор пользователя участником (пользователь предоставил приложению разрешение на отправку идентификатора пользователя на сервер).

3а. сервер возвращает "истинный" ответ

4а. Приложение отправляет уведомление «У нас сегодня специальная акция для участников» на экран блокировки.

OR

3б. сервер возвращает "ложный" ответ

4б. приложение молчит (без уведомления пользователя)

К вашему сведению, этот ответ предполагает, что можно отправить запрос URL-адреса в фоновом режиме: в фоновом режиме


person James    schedule 22.01.2014    source источник


Ответы (2)


Вы в значительной степени определили все, что вам нужно сделать.

Когда вызывается метод didEnterRegion: вашего CLLocationManagerDelegate, вы можете запустить фоновую задачу, а затем запустить сетевой запрос. Получив ответ, вы можете при необходимости доставить локальное уведомление, а затем завершить фоновую задачу.

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    // If not already performing a background task for this region...

    UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }];

    // perform network request - if successful, display notification. when finished, end background task
}

Хотя я должен отметить, что на самом деле я бы не размещал управление фоновыми задачами и код веб-запросов непосредственно внутри моего метода didEnterRegion:. У меня был бы отдельный класс веб-API, который выполняет запросы и просто вызывает его из didEnterRegion:.

person James Frost    schedule 22.01.2014
comment
Еще одно важное замечание заключается в том, что iOS дает вашему приложению только 5 секунд для работы в фоновом режиме с момента входа в регион. Таким образом, если этот вызов веб-службы ответит через 6 секунд, вы не сможете предпринять какие-либо действия. (Есть и другие способы увеличить время работы в фоновом режиме, но они не являются автоматическими или гарантированными.) Суть в том, что вам лучше сделать этот веб-сервис быстрым, и вам лучше иметь план того, что произойдет, если вы не получите отклик. - person davidgyoung; 22.01.2014
comment
Спасибо @James-Frost - обнадеживает, что это кажется возможным. После публикации вышеизложенного я на самом деле подумал, что могу просто использовать push-уведомления для отправки уведомления непосредственно на устройство, когда это необходимо (из которого я могу запустить приложение и т. д.), что может обойти необходимость получения приложением ответа. то есть запустить процесс с телефона, а затем позволить серверу обрабатывать всю логику. - person James; 22.01.2014
comment
@davidgyoung В самом деле, поэтому, вероятно, имеет смысл явно запустить фоновую задачу, спросив, что это должно дать вам больше времени для выполнения. - person James Frost; 22.01.2014
comment
@James - Вы, конечно, можете просто сообщить своему серверу, когда вы входите в диапазон, и тогда он может определить, следует ли отправлять уведомление на устройство. - person James Frost; 22.01.2014
comment
Привет @davidgyoung Спасибо за ваш комментарий (и всю вашу помощь по SO - я прочитал/узнал много ваших ответов!). Ваша точка зрения о 5-секундном окне - вот почему я начал думать о том, чтобы позволить серверу/push-уведомлениям обрабатывать ответ. Это кажется довольно простым решением, так что я могу отправлять пользователю больше полезных ответов и не беспокоиться о 5-секундном окне. Вместо сообщения типа «У нас есть реклама», я мог бы отправить Привет, Джон, [мы знаем, что ты любишь гольф, поэтому] вот 50% скидка на мячи для гольфа. не прослушивается - person James; 22.01.2014
comment
Я тоже использовал push-уведомления. Преимущество в том, что вас не укусит 5-секундное окно. Недостатком является то, что push-уведомления доставляются по воздуху в свое приятное время — это может занять несколько минут после отправки. - person davidgyoung; 22.01.2014

Это тоже может помочь (краткий ответ «да», но ваша логика должна завершиться через 5 секунд): https://apple.stackexchange.com/questions/174787/can-ibeacon-range-region-monitoring-trigger-dynamic-data-based-notification/174873#174873

person Daniel Iversen    schedule 01.03.2015