Почему мое приложение iOS перезагружается с первого экрана после возврата в режим переднего плана?

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

Я зашел в интернет и узнал о сохранности и реставрации государства. Я реализовал на одном экране, но это не похоже на работу. Это то, что я сделал в appDelegate.m

    //appDelegate.m

    -(BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
    {
        return YES;
    }

    -(BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
    {
        return YES;
    }

Следующий код находится в appDelegate.m в методе willFinishLaunchingWithOptions. Я не использую раскадровку, так как это приложение очень старое. У него есть XIB. Так что это приложение всегда должно идти на экран входа в систему, где проверяется, сохранен ли accessToken, оно будет переходить на домашний экран с экрана входа в систему. Если он не сохранен, он останется на экране входа. Так что это обязательно для выполнения. Таким образом, есть только один способ закодировать это, как показано ниже.

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   ...
   ...
   loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];

   self.navigationController = [[UINavigationController alloc]initWithRootViewController:loginViewController];
   self.navigationController.restorationIdentifier = @"NavigationController";
   [loginViewController.view setBackgroundColor:[UIColor whiteColor]];
   self.window.rootViewController = self.navigationController;
   ...
   ...
}

Я дал restoreId для всех контроллеров представления, как показано ниже в viewDidLoad(). Например, это то, что я сделал в PetDetailViewController.m

    - (void)viewDidLoad
    {
        [super viewDidLoad];

        self.restorationIdentifier = @"MatchedPetIdentification";
        self.restorationClass = [self class];
    }

    -(void)encodeRestorableStateWithCoder:(NSCoder *)coder
    {
        [super encodeRestorableStateWithCoder:coder];
    }

    -(void)decodeRestorableStateWithCoder:(NSCoder *)coder
    {
        [super decodeRestorableStateWithCoder:coder];
    }

Теперь, когда я перехожу на экран PetDetail и нажимаю домашнюю кнопку, вызывается encodeRestorableStateWithCoder(). Остановка приложения из xcode, перезапуск его остается на том же экране, но сразу переходит на экран входа в систему и переходит на домашний экран (может выполняться код в willFinishLaunchingWithOptions)

Я делаю что-то не так? Как предотвратить перезапуск приложения с первого экрана, если пользователь не убил его вручную?

1 ответ

Вы не можете контролировать, когда ваше приложение переводится в приостановленное состояние из фонового состояния, ОС автоматически сделает это, чтобы выделить больше памяти для приложений переднего плана. Для получения дополнительной информации о переходах состояний и прекращении работы приложений вы можете обратиться к:

https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html