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