分别在Android和iOS中在后台运行任务有不同的方法。我在堆栈溢出时也发现了What is the best way to schedule task in android?。
我想知道哪个是仅使用react-native
的最佳方法。将setInterval
或setTimeout
用于必须每天或每隔几个小时运行的任务是否足够好?
这些任务不会被操作系统杀死吗?
有任何想法或建议吗?
答案 0 :(得分:17)
我将回答我自己的问题,看看这些信息是否可以被任何寻找它的人使用。
由于不同的移动操作系统倾向于杀死后台作业,或者将它们停止以节省电池,因此很少有确定性方法可以在本机中调度任务。我使用以下组合:
将计时器卸载到后台,该计时器适用于前置和后置https://github.com/ocetnik/react-native-background-timer中的应用程序(!如果使用create-react-native-app,则必须将其弹出)
在Android中使用iOS的后台获取和HeadlessTask,这是一个不错的库https://github.com/jamesisaac/react-native-background-task
使用地理位置更新来唤醒应用并启动线程https://github.com/mauron85/react-native-background-geolocation。
我猜你可以使用蓝牙唤醒来遵循类似的策略。
从服务器推送通知以确定应用程序唤醒应用程序(除非它已被操作系统杀死)。在iOS中,请确保调用notification.finish()
以避免被任务处理程序算法区分。
对于Android,您可以尝试使用AlarmManager API https://github.com/vikeri/react-native-background-job。
小心龙:如果在系统唤醒后滥用执行时间或内存使用情况,您的应用可能会被关闭。手机没有电池后,您可能需要为所有听众补充水分。因此,用户仍需要与您的应用进行大量互动。
<强>更新强>: 从Android O开始,有非常严格的后台执行限制。使用HeadlessJSTask服务时,如果您希望它持续时间超过几秒,请确保将其作为前台服务启动。它可能需要通知它。考虑到只加载捆绑包可能需要几秒钟,具体取决于您的应用和设备。
答案 1 :(得分:0)
事实上,还没有足够的方法。但是我们可以将mauron85标记为一种比android上其他版本更好的方法,但它在 IOS 上也无法完美运行。例如,如果应用已被用户杀死,则该作业将无法继续工作,或者无法对作业执行量进行任何控制,则每次设备更改位置时,该作业就会被触发。
其他组件(例如 react-native-background-fetch 和 react-native-background-task )具有作业执行期限的限制(作业每15分钟重复一次并且无法缩短该时间段),它们只能在android上运行。
如果 Facebook本机响应对于此问题有一些切实可行的解决方案,那将是很好的。