Предотвращение снимка экрана / очистка кэшированных данных, когда приложение iOS становится фоновым и возобновляется через долгое время - PullRequest
2 голосов
/ 18 февраля 2012

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

Теперь предположим, что пользователь делает паузу с помощью приложенияна 7 дней.При повторном открытии приложения он не должен видеть списки от 7 дней назад.Но если пользователь просто помещает приложение в фоновом режиме на несколько минут, он должен продолжить работу именно там, где он ушел.Я думал, что смогу решить эту проблему, убив приложение после определенного количества времени в фоновом режиме.Это код:

static BOOL goingToQuit = NO;

#define KILL_IN_BACKGROUND_AFTER_SECS 300

- (void)applicationDidEnterBackground:(UIApplication *)application
{
  goingToQuit = YES;

  UIApplication* app = [UIApplication sharedApplication];
  UIBackgroundTaskIdentifier __block bgTask;
  bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
  }];

  if(UIBackgroundTaskInvalid != bgTask) {
    // Start the long-running task to kill app after some secs and return immediately.
    dispatch_after( dispatch_time(DISPATCH_TIME_NOW, KILL_IN_BACKGROUND_AFTER_SECS * 1e09), 
      dispatch_get_main_queue(), ^{
        if(goingToQuit) exit(0);
        [app endBackgroundTask: bgTask];
      });
  }
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
  // cancel ongoing background suicide.
  goingToQuit = NO;
}

На моем устройстве я вижу следующее: после KILL_IN_BACKGROUND_AFTER_SECS приложение убивается.После перезапуска журналы устройства показывают, что приложение получило новый PID, записи, показывающие перезапуск и т. Д. Однако устройство не показывает образ запуска default.png, а показывает снимок экрана с тем, где пользователь был раньше.

С другой стороны, если пользователь явно убивает приложение (дважды щелкнув по кнопке «Домой», коснитесь и удерживайте, щелкните по приложению), прежде чем он перезапустит его, приложение запустится со стартовым экраном default.png.Это поведение, которое я хочу при программном уничтожении приложения.

У кого-нибудь есть идеи, как этого добиться?Любая идея высоко ценится.

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

1 Ответ

2 голосов
/ 16 января 2013

В делегате вашего приложения applicationDidEnterBackground вы можете отобразить представление перед остальными вашими представлениями, которое ОС будет воспринимать как последнюю видимую вещь и которое будет отображаться, когда приложение снова станет активным (если оно еще живо)).

В делегате вашего приложения applicationDidBecomeActive вы можете проверить, нужно ли обновлять данные;если нет, то просто отклоните представление (анимация хороша), а если так, то сначала обновите (или просто удалите) ваши данные, а затем отклоните представление.

Это довольно распространено в приложениях.Многие просто используют образ запуска default.png, так как пользователи привыкли видеть его при нормальном запуске приложения.

...