Мониторинг маяка в фоновом режиме iOS

Я разрабатываю приложение для iOS в Swift, которое отслеживает события маяка. Это моя первая настоящая работа с маяком.

Я использую маяки Estimote, но не использую Estimote SDK. Я использую основное местоположение и CLLocationManager с событиями didExit и didEnter.

Я только прослушиваю маяки, которые зарегистрированы с текущим пользователем, который вошел в мое приложение. Например, Джон Доу может быть зарегистрирован в маяках A и B, а Мэри Сью зарегистрирована только в маяке C. Я сталкиваюсь с большим количеством ложных листьев и думаю, не из-за того ли это, где я реализую свой код.

Я понимаю, что при проверке события ухода по умолчанию существует 30-секундная задержка, но я испытываю периоды продолжительностью более 30 секунд без сигнала Bluetooth в упор. Возможно, реализовать 30-минутное окно, а не 30 секунд для проверки выхода?

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

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

Я изо всех сил пытался найти «соглашение о маяках iOS» в своем исследовании, просто примеры, которые дают некоторые результаты. Не слишком уверен, что на самом деле считается правильной практикой.

Спасибо!


person Cody Husek    schedule 15.05.2017    source источник
comment
вы должны предоставить нам код того, что вы сделали до сих пор, и только тогда мы сможем предоставить вам некоторые решения.   -  person Praveen Kumar    schedule 15.05.2017


Ответы (1)


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

Чтобы сделать это независимым от какого-либо одного ViewController, важно, чтобы логика запускалась AppDelegate. Здесь два варианта:

  • Поместите обратные вызовы мониторинга региона и логику фильтрации непосредственно в AppDelegate. Это подходит для небольших и простых приложений.

  • Поместите обратные вызовы и логику фильтрации в пользовательский класс и инициализируйте его с помощью метода didFinishLaunching класса AppDelegate. Это лучший подход для более крупных и сложных приложений, чтобы сделать AppDelegate простым и понятным.

В любом случае, крайне важно инициировать запуск мониторинга из метода didFinishLaunching. Это обеспечивает правильную настройку CoreLocation в фоновом режиме, если ваше приложение автоматически запускается при переходе между регионами.

person davidgyoung    schedule 15.05.2017
comment
Именно то, что мне нужно было услышать. Большое тебе спасибо. - person Cody Husek; 15.05.2017
comment
Существует ли какой-либо конкретный метод мониторинга для нескольких регионов? - person Cody Husek; 22.05.2017
comment
Несколько регионов не меняют настройки, описанные выше, но вы должны понимать, что первый регион, который вызывает вход или выход, когда ваше приложение не активно, будет тем, который запускает его в фоновом режиме. Последующие выходы из области ввода просто вызовут обратные вызовы к уже запущенному приложению без вызова didFinishLaunching. - person davidgyoung; 23.05.2017
comment
Можно ли отслеживать 2 региона, каждый из которых имеет уникальный UUID, и получать от менеджера местоположений информацию о входе/выходе из их региона? У меня не было успеха с попытками CLLocationManager или ESTBeaconMananager. При тестировании вы не можете иметь два маяка с разными UUID в непосредственной близости друг от друга? - person Cody Husek; 23.05.2017
comment
Это должно работать безупречно, и по моему опыту так и есть. Если вы можете сделать простой воспроизводимый тестовый пример и показать свой код, я бы предложил открыть новый вопрос. - person davidgyoung; 23.05.2017
comment
Не могли бы вы проверить мой последний пост? Спасибо - person Cody Husek; 25.05.2017