Запрос местоположения iPhone в фоновом режиме?
Простой вопрос... У меня есть приложение, которое регистрирует местоположение пользователя через 30 секунд (используя NSTimer), оно отлично работает, пока приложение не станет "неактивным", а NStimer остановится. Как следствие, я ищу варианты для поддержания моего интервала местоположения (30 секунд), который все еще способен записывать довольно точные данные о местоположении (с точностью до 100 м).
-
Option_001, Brute Force:. Пусть CLLocationManager, startUpdatingLocation выполняется все время с использованием UIBackgroundModes = "location". Не рекомендуется, разряжает аккумулятор. Регулярность по запросу, Точность ок. 10-65m. Возможно, это будет единственный реалистичный вариант.
-
Option_002, SLC: Я мог бы использовать значительное изменение местоположения, но частота обновлений местоположения довольно плохая (не говоря уже о точности). Это особенно актуально, если приложение работает в сельской местности или в пустыне с ограниченным количеством ячеек. Неопределенная регулярность, Точность ок. 500m
-
Option_003, Hybrid: Я мог бы использовать существенное изменение местоположения (SLC) в фоновом режиме в качестве индикатора "значительного" движения, а затем запросить местоположение GPS на основе kCLLocationAccuracyBest. Это будет работать, но события SLC не собираются приближаться к 30 секундам (особенно при ходьбе). Неопределенная регулярность, Точность ок. 10-50m.
-
Option_004, что-то еще? любые идеи будут высоко оценены.
ПРИМЕЧАНИЕ: Я думал, что у меня это работает, потому что когда вы нажимаете [LOCK] на iPhone (подключен через USB), приложениеWillResignActive вызывается, но NSTimers не останавливаются. Если вы попробуете то же самое, если iPhone не подключен (т.е. Когда телефон будет в обычном режиме), NSTimers остановятся почти сразу после вызова приложенияWillResignActive.
Ответы
Ответ 1
Прежде всего, не используйте таймер для обновления местоположения пользователя. Подходите к нему с другого конца:
проверить, когда полученное новое местоположение, интервал с момента последней "записи" и решить, хотите ли вы записать новое местоположение или нет.
Кроме того, это обострит вашу проблему с "неактивным" состоянием. Просто включите службы определения местоположения. Info.plist > Необходимые фоновые режимы > Регистры приложений для обновлений местоположения
В то время как в фоновом режиме, когда получено новое местоположение, ваше приложение переходит в "активное состояние", которое позволит достаточно времени для вызова API и нажать новое местоположение.
В предложении вам нужно разработать это приложение, чтобы хорошо работать с новыми фоновыми режимами.
Примечание. Это решение не будет работать для iOS3.x
Ответ 2
Вы можете добавить основное местоположение в фоновой активности plist.
plist > "Необходимые фоновые режимы" > "Регистры приложений для обновлений местоположения"
Менеджер местоположений обратится назад
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
Будет работать, пока ваше приложение перейдет на задний план.
Ответ 3
Откажитесь от полу ответа, но если бы я попытался это сделать, я использовал бы Profiler Profiler + UIBackgroundModes = "location", но установил желаемую точность kCLLocationAccuracyHundredMeters (или меньше) и посмотрел, дает ли это разумный номер использования энергии.
Я прочитал несколько документов CoreLocation - вам может быть не повезло, если это не сработает.
Кроме того, на основе вашей точности 500 м для SLC вы, возможно, прочитали это, но здесь есть хороший анализ точности SLC здесь: http://longweekendmobile.com/2010/07/22/iphone-background-gps-accurate-to-500-meters-not-enough-for-foot-traffic/