草庐IT

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

coder 2023-07-26 原文

一些背景

我正在开发一个 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 - 在 iOS 6 及更高版本中手动调用状态保存的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  4. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  5. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  6. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  7. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  8. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  9. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  10. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

随机推荐