CoreLocationManager никогда не делает пауз? - PullRequest
6 голосов
/ 04 февраля 2020

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

Приложение уже полчаса включено, и служба определения местоположения не останавливается. Я думаю, что это имело место, так как Apple изменила местоположение в iOS 13? Я не совсем уверен. Вся документация, которую я могу найти в Интернете, выглядит крайне устаревшей.

Любой совет очень ценится, соответствующий код следует:

init() {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.distanceFilter = 10
        locationManager.activityType = .fitness
        locationManager.requestAlwaysAuthorization()
        locationManager.allowsBackgroundLocationUpdates = true
        locationManager.pausesLocationUpdatesAutomatically = true
        locationManager.showsBackgroundLocationIndicator = true
        locationManager.startUpdatingLocation()
    }
    func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) {
        delegate?.paused(tracker: self)
        print("MT | LOCATION SERVICES PAUSED!") <---- NEVER GETTING CALLED (been running for 40 minutes now, no location updates, still going though?)
        // if not already, start region monitoring

    }
 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        // Collect data
        for location in locations {
           print("MT | New Location: \(location)")
        }
    }

Ответы [ 4 ]

1 голос
/ 07 февраля 2020

Я бы не рассчитывал на подключение к Xcode. Xcode обычно жадный . Он не хочет, чтобы вы прекратили отладку. Таким образом, оно никогда не переводит приложение в приостановленное состояние.

Обратный вызов locationManagerDidPauseLocationUpdates в некоторой степени идентичен приостановке работы вашего приложения, которую Xcode предотвращает.

Я бы протестировал это, используя os.log. Затем запишите результаты в консольное приложение вашего Ma c. Смотрите здесь .


Просто убедитесь, что приложение не запущено, если вы работаете из Xcode. Я бы лучше отключил ваше устройство от Xcode, убил приложение. Отключите ваше устройство от Xcode. Затем просто нажмите на значок приложения еще раз. Таким образом, Xcode не может вмешиваться.

0 голосов
/ 17 февраля 2020

Как вы думаете, может быть, ваш ActivityType мешает службам определения местоположения приостановить работу?

activityType

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

.fitness

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


Я не знаю, каков ваш конкретный вариант использования, но Вы рассматривали возможность использования следующей функции для фонового отслеживания местоположения?

startMonitoringSignificantLocationChanges ()

Вы также можете попробовать сочетание обоих, включив значительные изменения местоположения для дня в день использовать и позволяетBackgroundLocation при выполнении чего-либо вроде отслеживания прогона и т. д. c.

0 голосов
/ 14 февраля 2020

Проблема вызвана желаемой вами точностью.

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

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

0 голосов
/ 07 февраля 2020

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

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

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

Таким образом, вместо использования pausesLocationUpdatesAutomatically = true, вы можете сделать desiredAccuracy = kCLLocationAccuracyThreeKilometers.

По словам Apple,

[...] рассмотрите возможность отключения этого свойства и изменения точности местоположения на kCLLocationAccuracyThreeKilometers когда ваше приложение перемещается в фоновый режим. Это позволяет вам продолжать получать обновления местоположения в режиме энергосбережения

Не распространяется ли это на ваш вариант использования?

...