2017-02-04 4 views
-2

Чтобы избежать реализации постоянной логики кэширования всего навигационного стека, я хочу сохранить свое приложение «живым» (по крайней мере, на 2 часа) даже в фоновом режиме, поэтому, когда пользователь снова откроется приложение, где оно было, прежде чем идти спать.Предотвращение iOS из-за убийства моего приложения через 3 минуты

Я попытался с фоновой задачи:

_timerBackgroundTaskId = UIApplication.SharedApplication.BeginBackgroundTask(() => 
{ 
    // Run some dummy code here. Shouldn´t this prevent the task from actually stopping? 
    var remaining = UIApplication.SharedApplication.BackgroundTimeRemaining; 
    this.Log().Debug($"Expiration. Remaining: {remaining}. Timer seconds left: {_secondsLeft}"); 
}); 
// I´m actually using the timer for something :) 
_nsTimer = NSTimer.CreateRepeatingScheduledTimer(TimeSpan.FromSeconds(1), delegate { TimerTick(); }); 

// later on (after 3 minutes) 
UIApplication.SharedApplication.EndBackgroundTask(_timerBackgroundTaskId.Value); 

Независимо от того, что я стараюсь, через 3 минуты IOS убивает приложение. Некоторые ответы в SO рассказывают, как это сделать с поддельным фоновым звуком, но я не хочу никаких проблем с обзорами Apple.

Любые советы?

+1

Лучше правильно обрабатывать восстановление приложений, а не пытаться сделать что-то сложное. У вашего приложения есть только 3 минуты времени выполнения фона. Ограничения предназначены для максимального времени автономной работы и обеспечения доступности памяти для других приложений, которые пользователь может захотеть запустить. – Paulw11

+0

Восстановление - это то, что я пытаюсь избежать, но я сделаю это, если нет другого пути. – xleon

+2

Три минуты - это жесткий предел, если ваше приложение не использует законные возможности использования одного из доступных режимов фона. – Paulw11

ответ

1

Решение моей проблемы было так же просто, как делать точно ничего.

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

Ограничение на 3 минуты ТОЛЬКО при выполнении какой-либо задачи в фоновом режиме (то есть: UIApplication.SharedApplication.BeginBackgroundTask) для предотвращения разряда батареи.

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

В моем случае я использовал фоновое задание, чтобы поддерживать обратный отсчет/будильник. Но я только что нашел временное решение для планирования локальных уведомлений.

Если вы должны выполнить фоновую задачу, чтобы сохранить приложение состояние you've получил 2 вариант:

  1. Конца задачи, прежде чем 3 минуты
  2. Реализовать восстанавливающую стратегию. Сам iOS предоставляет для него built-in API.
Смежные вопросы