【问题标题】:How to avoid iOS app being terminated by system too often when in background如何避免iOS应用程序在后台被系统频繁终止
【发布时间】:2016-12-26 10:47:32
【问题描述】:

我正在为 iOS 8 和 9 构建一个 iOS 应用程序,但我遇到的问题是,当应用程序进入后台时,系统会在 2 或 3 分钟后终止它。

我的测试很简单:

  1. 我杀死了我 iPhone 上所有正在运行的应用程序。
  2. 我重新启动 iPhone(以确保没有其他应用占用内存)。
  3. 我启动了我的应用程序。
  4. 我在我的应用程序中什么都不做。
  5. 我按下“主页”按钮,将我的应用移至后台。
  6. 我等待 2 到 3 分钟什么都不做。
  7. 我再次打开我的应用程序并惊讶地发现,系统已将其终止,现在它正在重新启动作为新的启动。

一些cmets:

  • 该应用程序在后台不使用 CoreLocation,也不使用任何其他服务。
  • 我已经分析了应用程序,试图了解它是否消耗了太多内存。当移动到后台时,它会消耗大约 25Mb 的 RAM 内存。我在下面附上屏幕截图。
  • 此行为已在 iPhone 5、5s、6、6+ 上进行了测试。
  • 在 iPhone 6s 和 6s+ 中似乎需要更多时间才能发生,但仍然会发生。

我的问题是:你知道为什么会这样吗?有什么我可能没有考虑或忘记的吗?

我不想通过使用 CoreLocation 或类似的东西来强制我的应用在后台运行。如果系统最终杀死我的应用程序,我没问题。我不想要的是每次我将我的应用程序移到后台时系统都会终止它。

任何提示或帮助将不胜感激。

谢谢,

【问题讨论】:

  • 在应用程序委托中在方法中添加断点并看到它再次调用didFinishLaunchingWithOptions
  • 您的应用实际上在做什么?例如OpenGL 调用会让你的应用被杀。

标签: ios objective-c iphone memory


【解决方案1】:

系统会自动杀死所有应用程序

根据 Apple 文档:

应用程序终止

应用程序必须随时准备终止,并且不应>等待保存用户数据或执行其他关键任务。系统启动 > 终止是应用程序生命周期的正常部分。系统通常 > 终止应用程序,以便它可以回收内存并为其他应用程序腾出空间 > 由用户启动,但系统也可能终止 > 行为不端或未及时响应事件的应用程序。

暂停的应用在终止时不会收到任何通知; >system 杀死进程并回收相应的内存。如果应用 > 当前在后台运行且未挂起,则系统会在终止之前调用其应用委托的 >applicationWillTerminate:。 >设备重启时系统不会调用该方法。

除了系统终止您的应用外,用户还可以使用多任务 UI 显式终止您的应用。用户发起的终止 > 与终止暂停的应用程序具有相同的效果。应用程序的进程被 >killed 并且没有通知发送到应用程序。

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html#//apple_ref/doc/uid/TP40007072-CH2-SW1

您可以跟踪位置,但您肯定会看到一个蓝色状态栏,表示应用程序使用 GPS 跟踪。

也许您可以尝试在后台通过静默通知“唤醒”您的应用...

如果没有必要让您的应用保持活力,请相信系统...

【讨论】:

  • 感谢您的留言。我基本上已经意识到了这一点。我的问题是为什么终止它这么快?如果有什么我可以做的来避免这种情况。在玩其他应用时,我发现有些应用需要更多时间才能被系统终止。
  • @vilanovi 你可以检查一下 NSLog(@"%f",[UIApplication sharedApplication].backgroundTimeRemaining);
  • 在 applicationDidEnterBackground
  • 澄清一下:我不需要在后台运行我的应用程序。我只是不希望系统这么快“杀死”我的应用程序。应用可以在后台暂停。
  • 你无能为力。添加代码以在进入后台时保存状态,并在启动时恢复状态。它在用户运行大量应用程序时发生。
【解决方案2】:
  1. 您的代码中存在一些错误。请在运行您的应用程序之前选择调试导航器...现在您可以找到您的错误..

  2. 或者内存过多也会终止..

【讨论】:

  • 我已经意识到了这样的问题。这里我要问的是对 iOS 如何管理后台应用程序的更一般的理解。
【解决方案3】:

在后台运行的应用程序更快地消耗电池寿命,它会让您对设备而不是应用程序产生不好的看法,因为普通消费者不知道这是一个消耗电池电量的应用程序. 因此,iOS 不允许您的应用在后台运行超过几秒钟。但也有一些例外,应用可以通过声明其启动后台任务来请求对此进行扩展。

有关更多信息,您可以查看以下链接: http://blog.dkaminsky.info/2013/01/27/keep-your-ios-app-running-in-background-forever/

http://www.speirs.org/blog/2012/1/2/misconceptions-about-ios-multitasking.html

【讨论】:

  • 我不是在询问后台应用程序的执行。请在回答之前阅读问题。
  • 亲爱的 vilanovi,对于 atlandu 的回答,您评论说为什么应用程序终止如此之快?对于这个问题,直接的答案是节省电池寿命。对于您的第二个查询,如何避免这种情况?为此,我建议通过提供链接来使用 beginBackgroundTaskWithExpirationHandler。
  • 是的,是的。但问题的本质是不了解如何使应用程序在后台执行,而是尝试了解为什么以及何时被系统杀死。
猜你喜欢
  • 2018-08-05
  • 2019-09-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
相关资源
最近更新 更多