React Native 写了个可以理解为定时爬虫的 App,获取到新数据时会向用户发送一个 Local Notification.
目前在 Android 上用 JobScheduler/AlarmManager 定时执行任务
因为可能有 iOS 的需求(我的主力机也是 iPhone ),考虑 build 一个 iOS 版本时发现 Background Task / Background Processing 相关的 API 并不能保证执行间隔
主要需求如下
而查阅的各种文档和 stackoverflow 等均表示 Background App Refresh 不能保证执行间隔,如果用户不常打开 App,甚至可能一天里都不会执行
这是否意味着要保证相对精度,只能起一个服务器定时给用户发静默推送拉起 App 才行了?
EDIT:
1
wienli 2021-05-06 14:19:22 +08:00
作为一个半吊子 iOS 开发告诉你:这个是伪需求,首先苹果对后台进程管理非常严格,一般在退出应用 15-30min 后,进程就被杀死。
APNS 也只是苹果推送服务器与你手机的通信,想靠外部非主观操作激活应用是不可取的 |
2
kera0a 2021-05-06 14:34:31 +08:00 via iPhone
定时由服务器发送推送触发执行是可行的。
NotificationServiceExtension 可以有一点执行时间,爬个页面是足够了。 iOS14 小组件也可以,可以搞一个定时刷新的任务交给系统调度,只要保证手机每天会打开就行。 还有就是类似 vpn 那种 app 了,可以直接起个服务后台常驻 |
3
dcty 2021-05-06 14:40:07 +08:00
要不用 GPS 的那种方案(始终允许)可能也可以,参考:life cycle,腾讯手机管家的“智能个人报告”,耗电量几乎没有什么感知。
|
4
KirbySD OP @wienli
后台任务的限制在文档里里面有提及过,不过我打算使用的是后台 App 刷新一类,将任务注册给系统,由系统安排执行的那种 APNS 的静默推送的话,https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app 有提及到"To deliver a background notification, the system wakes your app in the background. ... Your app has 30 seconds to perform any tasks and call the provided completion handler." 这里,我在想这个方法是不是可行 @kera0a 感谢。定时刷新任务主要担心用户不一定每天都打开,这个小功能也没必要后台常驻,最后可能还是考虑用推送解决吧…… @dcty 您指的是 Significant-Change Location Service ( https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/using_the_significant-change_location_service )吗? 感觉有点不太可控……不过感谢建议 |
5
frqk 2021-05-06 20:53:05 +08:00 via iPhone
你说的静默推送是有可能实现,不过苹果文档里也说了静默推送是不保证会送到的。系统会不会收到你发的静默推送完全看心情(看电量网络情况还有间隔啥的),有可能你发 10 条结果只有一条会收到。
而且锁屏时收到的静默推送所执行的代码可能会有一定的限制。我之前是获取 healthkit 的步数结果锁屏是获取不了。 |