首页 > 解决方案 > 在特定时间在 Flutter 应用程序中运行任务

问题描述

你好颤振/移动开发者,

我手头有一个特殊的问题,我需要一些建议。我需要创建一个在一天中的特定时间执行特定任务的应用程序。时间每天都会变化,它会在午夜(或非高峰时间)通过 REST 调用获取更新的时间。无论如何,任务必须在预定的时间完成,即使在设备重启等之后。我已经对此进行了广泛的研究,我感觉 Flutter 不能很好地处理预定的任务,尤其是在 iOS 中,它可以终止一个应用程序无论出于何种原因。

我研究过的选项是:

  1. workmanager(https://pub.dev/packages/workmanager/changelog):这似乎是最有希望的,如果不是 15 分钟的最低频率,这对我来说还不够。如果是时候完成任务,我需要每分钟检查一次。有没有办法绕过这个限制?

  2. 本机解决方案。我对原生 iOS 和 Android 编码几乎没有经验,所以我不喜欢这个解决方案。但是通过一些研究,我看到了一些可以通过这种方法安排任务的示例。

  3. 服务器端通知。从表面上看,这似乎是一个很好的解决方案,我需要这方面的建议。是否该运行任务的计算将发生在服务器端,并且可以向设备发送通知(例如通过 Firebase),这将触发任务运行。这是否可行,设备在收到通知时会实际运行代码吗?

所以这些是我的选择。你觉得哪个最可行?如果比我有更多移动经验的人可以帮助我,我将不胜感激,也许有比我提出的三个更好的解决方案。谢谢你。

标签: androidiosswiftflutterscheduled-tasks

解决方案


时间每天都会变化,它会在午夜(或非高峰时间)通过 REST 调用获取更新的时间。

这闻起来像糟糕的建筑。为什么?

  • 您在午夜对更新服务器进行 DDOS 攻击(如果您在同一时区有很多用户)。您可以将 HTTP 请求错开几秒钟来解决此问题,但这是一种创可贴,而不是长期解决方案。
  • 因为您正在反转依赖关系:听起来时间是服务器的责任(因此您的客户调用它来询问最新时间)。您的客户端不应该是向服务器请求更新的人,因为现在您的客户端有 2 个作业:安排计划更新并为用户安排计划任务。让客户询问服务器是错误的方向。您应该从服务器发送消息以更新设备上的计划。
  • 即使您确实轮询服务器以获取计划更新,您也应该让移动应用程序在您想要的时间安排通知/警报。使用静默通知是 iOS 上后台调度限制的已知解决方法。在 Android 上,WorkManager不是正确的库,您应该使用AlarmManager.
  • 下面是另一个 StackOverflow 考虑使用本地通知来解决问题的方法:他们使用了 flutter_local_notifications

回答要点

  1. 在 Android 上,不要使用 WorkManager,而是使用AlarmManager,甚至更好的是安排通知。话虽如此,Android 上有一些制造商特定的怪癖,请参阅flutter_local_notifications文档:

因此,当应用程序在某些设备(例如小米、华为)的后台时,预定通知可能不起作用。如果您遇到这样的问题,那么这就是原因。由于这是操作系统强加的限制,这不是插件可以解决的问题。

  1. 不需要使用本机代码,通知是标准功能。
  2. 您现在可以保留轮询架构,因为它更简单(但更脏)。即使您愿意使用服务器端架构,我也会从服务器向客户端发送消息以仅更新客户端计划,而不是触发工作/用户警报,否则当它不响时,您会使您的应用程序依赖于互联网就像需要互联网一样(与社交媒体通知不同)。对于连接不良的设备,这将导致糟糕的用户体验。

推荐阅读