V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
KirbySD
V2EX  ›  iDev

iOS 上有什么类似 JobScheduler / WorkManager 的 API 吗,还是只能用 APNS 静默推送做个 workaround

  •  
  •   KirbySD · 2021-05-06 14:03:02 +08:00 · 3118 次点击
    这是一个创建于 1324 天前的主题,其中的信息可能已经有所发展或是发生改变。

    React Native 写了个可以理解为定时爬虫的 App,获取到新数据时会向用户发送一个 Local Notification.
    目前在 Android 上用 JobScheduler/AlarmManager 定时执行任务
    因为可能有 iOS 的需求(我的主力机也是 iPhone ),考虑 build 一个 iOS 版本时发现 Background Task / Background Processing 相关的 API 并不能保证执行间隔

    主要需求如下

    • 执行间隔不需精确,类似 JobScheduler 一类实际 interval 为 1 ~ 2 倍是可以接受的
    • 需要确保即使用户不打开 App,每天也至少执行 2 次左右

    而查阅的各种文档和 stackoverflow 等均表示 Background App Refresh 不能保证执行间隔,如果用户不常打开 App,甚至可能一天里都不会执行

    这是否意味着要保证相对精度,只能起一个服务器定时给用户发静默推送拉起 App 才行了?


    EDIT:

    • 爬虫逻辑不能放到服务器端执行,因为包含用户登录第三方网站的 cookie,可能有安全风险
    • 大部分用户可能一天下来并不会有几次数据更新,但需要爬取的数据只会在源地址保留最新 20 次,等用户想起来打开 App 手动获取会有遗漏风险
    5 条回复    2021-05-06 20:53:05 +08:00
    wienli
        1
    wienli  
       2021-05-06 14:19:22 +08:00
    作为一个半吊子 iOS 开发告诉你:这个是伪需求,首先苹果对后台进程管理非常严格,一般在退出应用 15-30min 后,进程就被杀死。
    APNS 也只是苹果推送服务器与你手机的通信,想靠外部非主观操作激活应用是不可取的
    kera0a
        2
    kera0a  
       2021-05-06 14:34:31 +08:00 via iPhone
    定时由服务器发送推送触发执行是可行的。
    NotificationServiceExtension 可以有一点执行时间,爬个页面是足够了。

    iOS14 小组件也可以,可以搞一个定时刷新的任务交给系统调度,只要保证手机每天会打开就行。

    还有就是类似 vpn 那种 app 了,可以直接起个服务后台常驻
    dcty
        3
    dcty  
       2021-05-06 14:40:07 +08:00
    要不用 GPS 的那种方案(始终允许)可能也可以,参考:life cycle,腾讯手机管家的“智能个人报告”,耗电量几乎没有什么感知。
    KirbySD
        4
    KirbySD  
    OP
       2021-05-06 14:59:18 +08:00
    @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 )吗?
    感觉有点不太可控……不过感谢建议
    frqk
        5
    frqk  
       2021-05-06 20:53:05 +08:00 via iPhone
    你说的静默推送是有可能实现,不过苹果文档里也说了静默推送是不保证会送到的。系统会不会收到你发的静默推送完全看心情(看电量网络情况还有间隔啥的),有可能你发 10 条结果只有一条会收到。
    而且锁屏时收到的静默推送所执行的代码可能会有一定的限制。我之前是获取 healthkit 的步数结果锁屏是获取不了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2784 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:50 · PVG 10:50 · LAX 18:50 · JFK 21:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.