Це розділ із документації CLLocationManager, що описує поведінку програми за допомогою startMonitoringSignificantLocationChanges :
Якщо ви запускаєте цю послугу, а ваша програма згодом припиняється, система автоматично запускає програму на другий план, якщо приходить нова подія. У такому випадку словник параметрів передається додатку: didFinishLaunchingWithOptions: метод делегата вашої програми містить ключ UIApplicationLaunchOptionsLocationKey, щоб вказати, що ваша програма була запущена через подію локації. Після повторного запуску потрібно все-таки налаштувати об’єкт диспетчера місцеположень та викликати цей метод, щоб продовжувати отримувати події місцеположення. Після перезавантаження служб локації поточна подія негайно доставляється вашому делегату. Крім того, властивість місцеположення об’єкта вашого менеджера локації заповнюється самим останнім об’єктом локації ще до того, як ви запускаєте служби локації.
Тож я розумію, що якщо ваш додаток припиняється (і я вважаю, що якщо ви не зателефонуєте stopMonitoringSignificantLocationChanges from applicationWillTerminate ), ви отримаєте пробуджений параметр UIApplicationLaunchOptionsLocationKey до програми: didFinishLaunchingWithOptions . У цей момент ви створюєте свій CLLocationManager , зателефонуйте startMonitoringSignificantLocationChanges і виконайте обробку вашого фонового місцезнаходження протягом обмеженого часу . Так що я добре з цим шматочком.
У попередньому параграфі йдеться лише про те, що відбувається, коли додаток припинено, він не підказує, що робити, коли додаток призупинено. Документація для didFinishLaunchingWithOptions говорить:
Додаток відстежує оновлення місцеположення у фоновому режимі, очищено та тепер відновлено. У цьому випадку словник містить ключ, який вказує на те, що додаток було перезапущено через нову подію локації.
Запропонуйте, що ви отримаєте цей дзвінок лише після запуску програми (через зміну місця розташування) після того, як ви припините.
Однак абзац про службу суттєвих змін у Посібнику з програмування поінформованості про місцеположення повинен сказати наступне:
Якщо ви залишите цю послугу запущеною, а ваша програма згодом буде призупинена або припинена, служба автоматично прокидає вашу програму, коли надійдуть нові дані про місцезнаходження. Під час пробудження вашій програмі відкладається на другий план і надається невелика кількість часу для обробки даних про місцезнаходження. Оскільки ваша програма знаходиться у фоновому режимі, вона повинна робити мінімальну роботу та уникати будь-яких завдань (наприклад, запитів у мережі), які можуть запобігти її поверненню до закінчення виділеного часу. Якщо цього не відбувається, Ваша заявка може бути припинена.
Це говорить про те, що вас прокидають дані про місцезнаходження, якщо ваш додаток призупинено, але не вказується, як вас прокидають:
- Чи отримує UIApplicationDelegate зворотний дзвінок, який повідомляє мені про те, що я поновлююсь з призупиненого стану у фоновий стан?
- Чи розпочинає отримувати менеджер місцеположення (який був замороженим під час призупинення роботи програми) для отримання LocationManager: didUpdateToLocation: від зворотних викликів локації ?
- Чи потрібно мені просто реалізувати код у своєму повідомленні didUpdateToLocation, яке перевіряє стан програми та робить мінімальну обробку, якщо у фоновому режимі?
Під час написання цього запису я думаю, що, можливо, я просто відповів на власне запитання, але було б чудово, щоб моє розуміння цього підтвердило хтось більш обізнаний.