一些背景
我正在开发一个 iOS 应用程序,我们希望在其中保留应用程序的状态。
在此应用程序发布之前,iOS 7 很可能已经发布或即将发布,而且大多数人似乎已经离开 iOS 5。因此我们决定开发 iOS 6 及更高版本。
在 iOS 6 中,有一些用于保存状态的非常好的功能。只需为 Storyboard中的所有 View 提供唯一 ID,并在“AppDelegate”中实现这两个功能:
- (BOOL)application:(UIApplication*)application shouldSaveApplicationState:(NSCoder*)coder;
- (BOOL)application:(UIApplication*)application shouldRestoreApplicationState:(NSCoder*)coder;
然后 iOS 将“自动”保留应用程序的导航历史记录。方法:
- (void)encodeRestorableStateWithCoder:(NSCoder*)coder;
- (void)decodeRestorableStateWithCoder:(NSCoder*)coder;
然后可用于存储和检索数据。
没有问题,它可以正常工作。但是,保存状态的方法只有在应用程序进入后台时才会触发。
假设我们有一个带有四个 ViewController 的 NavigationController:A、B、C 和 D。用户从 A 导航到 B,在 B 中他切换到 Safari 来搜索一些东西。应用程序状态保存在 B 中。然后用户切换回应用程序并导航到 C,然后导航到 D。不幸的是,在 D 中,应用程序遇到异常并关闭。当用户重新启动应用程序时,iOS 将尝试恢复保存的状态。但是,此状态保存在 B 中。这意味着当应用程序启动时,它不会从头开始,而不是从用户离开的位置 (D) 甚至上一个 View (C) 开始,而是在 B 中。
可能的解决方案
如果应用程序在每个新 View 中都保存其状态,则可以避免上述情况。但是(据我所知)没有任何公共(public)方法来触发状态保存过程。 我在调试时检查了调用堆栈,发现 iOS 在 iOS 6 中的 UIApplication 对象上调用了以下方法:
_saveApplicationPreservationState:
以及 iOS 7 中的以下方法:
_saveApplicationPreservationState:viewController:sessionIdentifier:beginHandler:completionHandler:
根据 iOS 版本,似乎还有另一种调用上述方法之一的方法:
_saveApplicationPreservationStateIfSupported
像这样调用这个方法:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(_saveApplicationPreservationStateIfSupported)])
[[UIApplication sharedApplication] performSelector:@selector(_saveApplicationPreservationStateIfSupported)];
我可以看到调用了预期的方法。
实际问题
如果我采用上述解决方案,我的应用是否会被 App Store 拒绝?我的意思是从技术上讲它不是私有(private)方法,只是没有公开。通过将调用包装在“respondsToSelector”中,应用程序不会在 API 更改时崩溃,只是不会经常保存状态。但是,如果它可以让应用程序被拒绝,那不是一个选择。
或者除了上述方法之外,还有其他方法可以手动调用状态保存过程吗?如果能够使用内置功能而不是构建将状态保存到 NSUserDefaults
的自定义解决方案,我会很高兴。
最佳答案
事件如果问题已经 2 岁了,我会试试我的运气。顺便说一句,我想,你现在很可能已经解决了它。
你肯定会被拒绝。他们正在扫描您正在调用的方法的源代码。当我使用 UDID 方法时,我遇到过几次。希望对您有所帮助。
关于ios - 在 iOS 6 及更高版本中手动调用状态保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17146624/