Подтвердить что ты не робот

Вручную вызовите сохранение состояния в iOS 6 и далее

Некоторый фон

Я работаю над приложением iOS, где мы хотим сохранить состояние приложения.
Прежде чем это приложение отключится, iOS 7, скорее всего, будет выпущен или скоро будет выпущен, а большинство, похоже, отошло от iOS 5. Поэтому мы решили разработать для iOS 6 и далее.

В iOS 6 есть несколько действительно хороших функций для сохранения состояния. Просто дайте все представления в уникальных идентификаторах раскадровки и реализуйте эти две функции в "AppDelegate":

- (BOOL)application:(UIApplication*)application shouldSaveApplicationState:(NSCoder*)coder;
- (BOOL)application:(UIApplication*)application shouldRestoreApplicationState:(NSCoder*)coder;

iOS затем "автоматически" сохранит историю навигации приложения. Методы:

- (void)encodeRestorableStateWithCoder:(NSCoder*)coder;
- (void)decodeRestorableStateWithCoder:(NSCoder*)coder;

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

Скажем, у нас есть один NavigationController с четырьмя ViewControllers: A, B, C и D. Пользователь переходит с A на B, в B он переключается на Safari на Google. Состояние приложения сохраняется в B. Затем пользователь переключается обратно в приложение и переходит на C, а затем на D. В D приложение, к сожалению, встречает исключение и опускается. Когда пользователь перезапустит приложение, iOS попытается восстановить сохраненное состояние. Однако это состояние было сохранено в B. Это означает, что когда приложение запускается, оно не начинается с начала, а не там, где пользователь оставил его (D) и даже не предыдущий вид (C), а в B.

Возможное решение

Вышеупомянутый сценарий можно было бы избежать, если приложение сохраняло свое состояние на каждом новом представлении. Однако нет (насколько я знаю) каких-либо общедоступных методов для запуска процесса сохранения состояния. Я изучил стек вызовов во время отладки и выяснил, что iOS вызывает следующий метод для объекта UIApplication в iOS 6:

_saveApplicationPreservationState:

и следующий метод в iOS 7:

_saveApplicationPreservationState:viewController:sessionIdentifier:beginHandler:completionHandler:

Также существует другой метод, который вызывает одно из указанных выше в зависимости от версии iOS:

_saveApplicationPreservationStateIfSupported

Вызывая этот метод следующим образом:

    if ([[UIApplication sharedApplication] respondsToSelector:@selector(_saveApplicationPreservationStateIfSupported)])
        [[UIApplication sharedApplication] performSelector:@selector(_saveApplicationPreservationStateIfSupported)];

Я вижу, что вызывается ожидаемые методы.

Фактический вопрос

Если бы я пошел с вышеупомянутым решением, это могло бы заставить мое приложение отклонить приложение из App Store? Я имею в виду технически это не частный метод, он просто не раскрывается. Обернув вызов в "responsesToSelector", приложение не будет разбиваться, если API изменятся, он просто не будет сохранять состояние так часто. Но если это может заставить приложение отклонить его, это не вариант. Или есть ли другой способ вручную вызвать процесс сохранения состояния, отличный от описанного выше? Мне было бы неплохо использовать встроенные функции, а не создавать настраиваемое решение, которое сохраняет состояние до NSUserDefaults.

4b9b3361

Ответ 1

Событие, если вопрос уже 2 года, я попробую удачу. Btw op, я думаю, вы, скорее всего, решите его на данный момент.

Вы наверняка получите отказ. Они сканируют исходный код для методов, которые вы вызываете. У меня это было несколько раз, когда я использовал методы UDID. Надеюсь, что это помогло.