在iOS 6及更高版本中手动调用状态保留

Ryu*_*ora 18 objective-c ios

一些背景

我正在开发一个iOS应用程序,我们希望保留应用程序的状态.
在此应用程序发布之前,iOS 7很可能已经发布或即将发布,而且大多数似乎已经从iOS 5发布.因此,我们决定开发iOS 6.

在iOS 6中,有一些非常好的功能可以保存状态.只需在storyboard中提供所有视图的唯一ID,并在"AppDelegate"中实现这两个功能:

- (BOOL)application:(UIApplication*)application shouldSaveApplicationState:(NSCoder*)coder;
- (BOOL)application:(UIApplication*)application shouldRestoreApplicationState:(NSCoder*)coder;
Run Code Online (Sandbox Code Playgroud)

然后,iOS将"自动"保留应用程序的导航历史记录.方法:

- (void)encodeRestorableStateWithCoder:(NSCoder*)coder;
- (void)decodeRestorableStateWithCoder:(NSCoder*)coder;
Run Code Online (Sandbox Code Playgroud)

然后可以用于存储和检索数据.
它没有问题,没有问题.但是,只有在应用程序进入后台时才会触发保存状态的方法.

假设我们有一个带有四个ViewControllers的NavigationController:A,B,C和D.用户从A导航到B,在B中他切换到Safari来google.应用程序状态保存在B.然后用户切换回应用程序并导航到C然后导航到D.在D中,应用程序不幸遇到异常并且关闭.当用户重新启动应用程序时,iOS将尝试恢复已保存的状态.然而,这个状态保存在B中.这意味着当应用程序启动时,它不会从头开始,而不是用户离开它的地方(D),甚至不是前一个视图(C),而是在B.

可能的解决方案

如果应用程序在每个新视图中保存其状态,则可以避免上述情况.但是,据我所知,没有任何公共方法可以触发状态保存过程.我在调试时检查了调用堆栈,发现iOS在iOS 6中的UIApplication对象上调用了以下方法:

_saveApplicationPreservationState:
Run Code Online (Sandbox Code Playgroud)

以及iOS 7中的以下方法:

_saveApplicationPreservationState:viewController:sessionIdentifier:beginHandler:completionHandler:
Run Code Online (Sandbox Code Playgroud)

似乎还有另一种方法根据iOS版本调用上述方法之一:

_saveApplicationPreservationStateIfSupported
Run Code Online (Sandbox Code Playgroud)

通过调用此方法,如下所示:

    if ([[UIApplication sharedApplication] respondsToSelector:@selector(_saveApplicationPreservationStateIfSupported)])
        [[UIApplication sharedApplication] performSelector:@selector(_saveApplicationPreservationStateIfSupported)];
Run Code Online (Sandbox Code Playgroud)

我可以看到调用了预期的方法.

实际的问题

如果我使用上述解决方案可以让我的应用程序被拒绝从App Store?我的意思是技术上它不是一种私人方法,它只是没有暴露.通过将调用包装在"respondsToSelector"中,如果API被更改,应用程序将不会崩溃,它只是不会经常保存状态.但如果它可以让应用程序被拒绝,那么这不是一个选择.或者除了上面描述的那个之外还有其他任何手动调用状态保存过程的方法吗?我很高兴能够使用内置功能,而不是构建一个保存状态的自定义解决方案NSUserDefaults.

小智 1

如果这个问题已经有两年了,我会试试运气。顺便说一句,我想,你现在很可能已经解决了这个问题。

你肯定会被拒绝。他们正在扫描源代码以查找您正在调用的方法。当我使用 UDID 方法时,我曾多次遇到过这种情况。希望有帮助。