防止iOS在几分钟后杀死App

Posted

技术标签:

【中文标题】防止iOS在几分钟后杀死App【英文标题】:Prevent iOS from killing App after a few minutes 【发布时间】:2018-01-30 22:59:48 【问题描述】:

我想阻止 ios 在几分钟后杀死我的应用。 我在这里读过这个帖子:Prevent iOS from killing my app after 3 minutes。它说如果我没有超过 3 分钟的后台任务,我的应用程序不会被杀死。有人可以验证这是真的吗?因为我的后台任务运行时间不超过 3 分钟,即使我的应用程序在此时间后被杀死。 我的后台任务是一个更新小部件的计时器。下面是一些代码:

self.backgroundTask = UIApplication.shared.beginBackgroundTask  [weak self] in
        self?.endBackgroundTask()
//endBackGroundTask looks like this
UIApplication.shared.endBackgroundTask(self.backgroundTask)
    self.backgroundTask = UIBackgroundTaskInvalid
//
    
self.timer = Timer.scheduledTimer(timeInterval: 1, target: self,   selector: (#selector(self.updateTimer)), userInfo: nil, repeats: true)

.

// at the beginning of the class
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid

.

// in viewWillDisappear
self.timer.invalidate()
    if self.backgroundTask != UIBackgroundTaskInvalid 
        self.endBackgroundTask()

    

【问题讨论】:

你不能在后台无限期地运行定时器; 3 分钟后,您的应用将因超过后台时间而终止。当您的应用不在前台时,应该不需要持续更新任何内容。这对电池使用效率不高。 也许您应该澄清“后台任务”的含义,因为您引用了viewWillDisappear;如果您的真正意思是在您的应用程序处于活动状态时运行计时器以定期更新您的 UI,那么这不是后台任务,您不需要使用 beginBackgroundTask;如果您想在您的应用程序通常被暂停时执行工作(即用户按下主页按钮移动到另一个应用程序),您只需要使用此选项。如果您只想在应用程序处于前台时计时,只需删除所有后台任务内容即可。 计时器从字面上倒计时并根据应用状态是 .active 还是 .background 更新当前视图或相应的小部件。 对,所以这类事情的标准方法是在您的应用程序处于活动状态时使用计时器,然后当它移动到后台时,您保存时间戳。当您的应用返回前台时,您可以计算经过的时间并更新您的 UI。您甚至可以在应用进入后台时安排本地通知,以便在适当的时间显示通知。 但是我将无法在我的小部件中显示滴答秒数,这是我想保留的应用程序的一个非常有用的功能。 【参考方案1】:

您需要构建应用程序,使其不需要在后台持续执行。据我了解,您的应用会显示倒数计时器,并且可以在“今日小部件”中显示相同的倒数计时器。我将使用的方法如下:

将计时器的“结束日期”存储在用户默认设置中以与您的小部件共享 当您的应用处于前台时,使用 Timer 定期更新您的 UI 当您的小部件正在显示时,请在小部件中使用Timer 定期更新其用户界面 当您的应用移至后台时,安排本地通知到期时间 当您的应用移回前台时,如果该计划通知尚未触发,您可以取消它。 在您的应用被合法终止(例如由于内存压力或长时间暂停)的情况下支持应用恢复

如果你这样做了,那么你永远不需要打电话给beginBackgroundTask。如果你调用beginBackgroundTask并且在进入后台3分钟内没有调用endBackgroundTask,那么即使你没有使用任何CPU,你的应用也会被终止。

【讨论】:

【参考方案2】:

简短回答:您不能运行超过 3 分钟的后台任务,除非您是逐步导航应用程序或音频播放器。 Apple 不允许这样做。

【讨论】:

我知道,但是在我在问题中链接的线程中,它说如果您的应用程序在后台没有做任何事情(或不超过 3 个 mimutes)它不会被杀死,所以没有必要用于恢复。我想重现这种行为,因为我的应用不需要超过 3 分钟的后台时间,但它必须恢复到与离开时相同的状态。 当用户切换应用程序时,应用程序会非常短暂地移至后台。除非他们要求额外的后台时间(最多 3 分钟),否则他们会切换到暂停状态,此时他们仍在内存中但不再获得后台时间。一旦一个应用程序被暂停,它就可以在没有任何警告的情况下随时终止,并且没有办法停止它。你可能会得到一份简历而不会被杀,或者你可能会被杀。你无法控制它。 当您发现您将被暂停时,您应该完全保存应用程序状态。如果你能恢复,那就太好了。如果你在暂停时被杀,你应该恢复你保存的状态。 我正在保存我的应用程序状态,但每次加载时,视图堆栈都会为用户可见地加载(就像他以编程方式导航到他离开的地方一样)。我不喜欢这种行为,我会尽量避免这种行为,因为我的用例是用户输入一些东西,把手机放几分钟然后又要输入一些东西是正常的.目前这导致几乎总是恢复应用状态。 嗨,如果我不将我的应用提交到 Apple App Store,而是提交到我的公司应用商店 (AirWatch),那么长时间运行的后台是否仍然有效?【参考方案3】:

您的后台任务是一个运行时间超过 3 分钟的计时器。所以你的应用程序被正确地杀死了。认为它已得到确认,因为那是 Apple 的设计。

杀死应用程序的不是计时器正在执行的操作,而是计时器本身。

您可以在Apple's Documentation 上阅读以了解更多信息。

始终尽量避免执行任何后台工作,除非这样做可以改善整体用户体验。应用程序可能会因为用户启动了不同的应用程序或者因为用户锁定了设备并且现在没有使用它而移动到后台。在这两种情况下,用户都在发出信号,表明您的应用现在不需要做任何有意义的工作。在这种情况下继续运行只会耗尽设备的电池电量,并可能导致用户完全强制退出您的应用程序。因此,请注意您在后台所做的工作,并尽可能避免。

【讨论】:

因此,即使我使计时器无效,测量的后台时间也会继续运行并因此达到 3 分钟限制? @LarsGvB 看起来你在 Paulw11 的道路上走得很好。我同意他在公开聊天中所说的一切。我很肯定私人聊天是有益的。同时,不要忘记标记此问题的答案以将其关闭。干杯。 我还不能测试这些东西。只要我有时间,如果他们解决了问题,我就会这样做。 @RBradshaw 仅供参考,从 cmets 打开的聊天不是“私人的”;如果您有足够的声誉,您可以点击链接阅读内容,甚至加入。

以上是关于防止iOS在几分钟后杀死App的主要内容,如果未能解决你的问题,请参考以下文章

如何防止主线程ios杀死后台线程

ios开发防止App被抓包(可正常请求)

如何以编程方式防止 Windows 硬盘驱动器减速?

如何防止 Spring Boot / Tomcat (Java8) 进程被 OOM 杀死?

如何防止 ActivityManager 杀死我的应用程序的后台进程

防止广播接收器被最近的应用程序杀死