【问题标题】:Detecting iOS app background termination by system系统检测iOS应用后台终止
【发布时间】:2018-08-05 02:55:14
【问题描述】:

我想要实现的是检测系统何时在后台运行(未挂起)时终止应用程序。根据this article,它可以通过消除过程来完成。其中一个步骤是确定用户没有强制退出应用程序。我假设这是通过检查是否调用了 applicationWillTerminate 来完成的。但是,根据 Apple 的文档,该方法也可以由系统调用,所以我不确定它是如何消除该选项的。

适用于不支持后台执行或链接的应用 针对 iOS 3.x 或更早版本,该方法总是在用户调用时调用 退出应用程序。对于支持后台执行的应用,此方法 一般不会在用户退出应用时调用,因为应用 在这种情况下,只需移动到后台。 但是,这种方法可能 在应用程序在后台运行的情况下调用 (未暂停)并且系统出于某种原因需要终止它。

是否可以检测到后台系统终止,如果可以,我在这里缺少什么?

【问题讨论】:

    标签: ios background terminate


    【解决方案1】:

    App Programming Guide for iOS: The App Life Cycle 说:

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

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

    以上与实证检验一致。

    在那篇Reducing FOOMs in the Facebook iOS app 文章中,他们提到了强制退出的情况,即应用确实“在应用最后一次打开时收到终止调用”:这仅适用于应用正在运行并且用户强制退出的情况。但是,如果用户首先返回主屏幕(或以其他方式暂停应用)然后强制终止应用,您将不会收到该终止。

    底线,如果应用程序在终止时被暂停,我不相信你有任何可靠的方法知道它是由于内存压力还是因为用户强制退出而被抛弃。该 FOOM/BOOM 文章中设想的强制退出方案显然仅适用于应用程序在强制退出时正在运行的情况。

    【讨论】:

    • 我要检测的是 BOOM 场景。问题是我无法区分用户终止应用程序和系统在应用程序运行(未暂停)时执行它。从我执行的测试中,我看到如果应用程序正在运行(前台或后台)applicationWillTerminate: 会在用户使用多任务 UI 终止它时被调用。因此,如果应用程序在运行时被系统终止,即使文档另有说明,它也不会被调用?
    • “如果应用程序在运行时被系统终止,它将不会被调用,即使文档另有说明”......如果操作系统需要终止在后台运行的应用程序,因为操作系统正在尝试为其他一些活动的应用程序释放资源,然后您将看到正常的生命周期应用程序委托调用,因为操作系统会优雅地终止您的应用程序。但是,如果您的应用程序本身由于无法检索内存而导致无法满足其自身的内存请求而崩溃,它将被立即终止,并且不会发生生命周期事件。
    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2016-04-17
    • 2021-11-29
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多