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

标签 ios objective-c

一些背景

我正在开发一个 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/

相关文章:

ios - 取消存档 SKSpriteNode 会破坏 iOS 7.1 中 Sprite 的 SKTexture,否则没问题

ios - 在 iOS 应用程序中的 fgets 上获取 EXC_BAD_ACCESS

iOS - 使用数字序列初始化 NSArray

ios - 在 AppStore 上更新使用 CoreData 的 iOS 应用程序

ios - 简单的 iPhone 应用程序使用太多内存 (4MB)

ios - objective-c 中 "Template method pattern"的实现

ios - 在 View Controller 之间传递数据

ios - iOS 中通过推送通知检测应用程序是否未打开?

iphone - 仅在 shouldChangeCharactersInRange 返回 yes 后调用方法

objective-c - UIView 会在 Cocoa Touch 中释放它的 subview 吗?