【问题标题】:Background task timers on iOSiOS 上的后台任务计时器
【发布时间】:2026-02-08 21:20:03
【问题描述】:

我有一个 android/winphone 应用程序。应用程序的一小部分(后台广播接收器/任务)不时(大约 10-15 分钟)检查带有时间戳的本地文件,如果时间戳之一与当前时间之间的差异超过 - 比如说 - 30 分钟,它会显示通知一个用户。

在 Android 中,我使用 AlarmManager.setRepeating(...) 设置定期检查,并运行此设置代码,我在 Manifest 中的操作“android.intent.action.BOOT_COMPLETED”上注册了一个 BroadcastReceiver。或者在每次启动时调用 AlarmManager.cancel(...) 和 AlarmManager.setRepeating(...)。这样我可以确定我的计时器可以正常工作。

在 Windows Universal 中,我使用触发器和后台任务。这同样适用,但有一些限制。

现在我正在将我的应用程序移植到 iOS,但快速查看无法让我注册一个函数或类,以便在应用程序本身未启动时每 10 分钟执行一次快速检查(通常不到一秒) ,并且我想在设备启动事件上注册一个功能。可能吗? 或者我应该让我的应用程序在后台运行?我不想这样做,因为我的支票很轻而且很少见。

【问题讨论】:

    标签: android ios timer background background-task


    【解决方案1】:

    您可以使用后台获取来快速执行。 但是有几个缺点:

    1. 在睡眠模式下不起作用。

    2. 您无法捕获设备启动事件。

    3. 将在 30 秒后掉落。

    我认为通常情况下这不是AlarmManager 的模拟。算了。

    https://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial

    https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

    推送通知可以用作触发器。但是,尽管如此,这是一个服务器端实现。

    在上面的指南中:

    1. 选中应用功能的背景模式中的背景提取框。

    2. 使用setMinimumBackgroundFetchInterval(_:) 设置适合您应用的时间间隔。

    3. 在您的应用委托中实现 application(_:performFetchWithCompletionHandler:) 以处理后台获取。

    你的回调事件是performFetchWithCompletionHandler

    【讨论】:

    • 感谢您的回答! RW 文章中的后台获取限制为 10 分钟 - 或没有?我看到了 Candy Crush,我相信它也是如此(因为它警告生命已恢复,我想这基本上是相同的计时器检查)。所以看起来可以生成背景检查。但是 - 这样的应用程序会永远在后台保持活力吗?如果一天一次我需要下载具有当前版本号的 32 字节文件怎么办 - 我应该怎么做(由于网络缓慢/错误,它应该需要 30 多秒,而通常需要几个)?
    • 进程执行很多会被iOS杀死。我必须测试长期线程。我遇到了同样的问题:AlarmManager 是 iOS。为了我的目的,我决定不在发布应用程序中使用后台获取进行定期启动。但也许你会为你找到一个不错的实现。
    • 但是如果我忘记网络查询而只读取本地文件并检查我的计时器 - 在应用程序进程关闭后它会工作吗?每 10 分钟
    • @Tertium ,已更新。简而言之,每次执行 30 秒。 iOS checkshow 多少秒你的应用程序在后台运行。这就是为什么setMinimumBackgroundFetchInterval 只是最短时间的原因。它不保证代码将每 10 分钟执行一次。检查一下。
    • 再次感谢,我会努力的。就我而言,这不仅仅是什么。关于设备启动 - 一般不可能还是仅用于后台任务?