iOS: запуск приложения в фоновом режиме с обновлениями местоположения

У меня есть намерение разработать приложение для iOS, которое работает с событиями входа/выхода из геозоны.

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

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

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

func keepAlive() {
     backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
         UIApplication.shared.endBackgroundTask(self!.backgroundTask)
         self?.backgroundTask = UIBackgroundTaskInvalid
         self?.keepAlive()
      }
}

Можно ли запускать приложение более 180 секунд? Я тестирую iOS 11 и 12.

Изменить: я попытался вызвать функцию keepAlive после завершения фоновой задачи, но во второй раз время фонового выполнения не увеличилось, и приложение было закрыто.


person Surjeet    schedule 15.11.2018    source источник
comment
Вы не можете держать приложение активным в фоновом режиме. iOS дает вашему приложению короткий промежуток времени для запуска кода, прежде чем приостановить его. Ваше приложение может реагировать только на обновления местоположения, и для каждого обновления требуется всего одна секунда или около того.   -  person Scriptable    schedule 15.11.2018
comment
С UIBackgroundTask я могу запускать приложение около 3 миллионов минут. Я хочу запускать приложение больше, чем это, если требуется.   -  person Surjeet    schedule 15.11.2018
comment
Да, я понимаю ваше требование. Здесь много раз спрашивали, но iOS не позволяет это сделать   -  person Scriptable    schedule 15.11.2018
comment
вы можете проверить приложение на фоновую загрузку, но вам нужно указать уважительную причину, если вы хотите опубликовать его в магазине приложений   -  person Stefan    schedule 15.11.2018
comment
180 секунд — это предел выполнения в фоновом режиме.   -  person Paulw11    schedule 15.11.2018
comment
@Paulw11 Paulw11 Упоминается ли это где-то в документах Apple или основано на личном опыте?   -  person Surjeet    schedule 15.11.2018
comment
Где-то упоминается.   -  person Paulw11    schedule 15.11.2018
comment
См. здесь: stackoverflow.com/questions/28275415/   -  person Paulw11    schedule 15.11.2018
comment
@Paulw11Paulw11 У вас есть эта ссылка, если да. пожалуйста, поделитесь, тогда я смогу убедить клиента в альтернативе.   -  person Surjeet    schedule 15.11.2018
comment
Протестируйте его с помощью: Примечание. Всегда предоставляйте обработчик срока действия при запуске задачи, но если вы хотите знать, сколько времени осталось для запуска вашего приложения, получите значение свойства backgroundTimeRemaining UIApplication. developer.apple.com/library/archive/documentation/iPhone/   -  person Scriptable    schedule 15.11.2018
comment
@Scriptable У меня есть блокировка обработчика истечения срока действия при запуске задачи, а также проверено свойство backgroundTimeRemaining с помощью таймера. Он возвращает мне 3 минуты на выполнение и после этого завершается.   -  person Surjeet    schedule 15.11.2018
comment
Так вот... у вас есть 3 минуты. это ваш ответ. вы не можете получить больше. объясни это своему клиенту   -  person Scriptable    schedule 15.11.2018
comment
Но мне нужно продлить это время, если потребуется. Чего я не мог добиться прямо сейчас.   -  person Surjeet    schedule 15.11.2018
comment
medium.com/@calvinlin_96474/   -  person canister_exister    schedule 15.11.2018


Ответы (1)


Уже существует официальный способ сделать это: просто используйте Всегда-авторизованный. С его помощью вы можете проверить местоположение пользователя в особый период.

person Jonathan    schedule 15.11.2018