[iOS 开发求助] 我目前在做一款番茄钟的 app,需要用户进入到后台的时候,番茄钟也可以一直运行,请问有什么好的实现方案吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Danmen123
V2EX    程序员

[iOS 开发求助] 我目前在做一款番茄钟的 app,需要用进入到后台的时候,番茄钟也可以一直运行,请问有什么好的实现方案吗?

  •  
  •   Danmen123 277 天前 2476 次点击
    这是一个创建于 277 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我本身是搞 Andorid 开发的,现在想要将应用移植到苹果端,碰见了这个问题,希望各位 iOS 大佬可以指教一下~!

    • 我自己初步调研了一下,iOS 上好像要配置一个backgroundMode
      • 目前好像只有设置为Audio的模式,可以一直在后台循环播放一个静音的音频,但是这种方案不清楚是否可以上架
      • 其它的模式貌似在后台运行都有一定的时间限制,不太符合我需要一直重复运行这个番茄中的需求
    23 条回复    2025-01-15 07:31:18 +08:00
    kera0a
        1
    kera0a  
       277 天前 via iPhone
    番茄钟为啥要后台持续运行?
    如果是计时可以用本地推送
    Danmen123
        2
    Danmen123  
    OP
       277 天前
    @kera0a 因为不仅仅是番茄钟,还有其他不同类型的倒计时器,比如我的应用可以实现 100 个不同时间的倒计时同时运行,且必须在倒计时器结束的时候给用户发送通知,而且要求时间准确(因为有的会精确到毫秒),不能有任何延迟的。本地推送的话,貌似推送的时间不保证准确性吧?
    kera0a
        3
    kera0a  
       277 天前 via iPhone
    @Danmen123
    本地推送精确到秒,你的需求提前计算好发送时间生成对应的本地推送即可。
    fds
        4
    fds  
       277 天前
    ……真有人需要 100 个倒计时么……
    本地推送上限是 64 个吧,我觉得正常情况下够用了。
    持续在后台跑着计时这种方案太浪费资源了,没必要。记录下结束时间,和本地时间对比一下显示出来就完事。精确到毫秒对于人类来说有些超纲。
    hebwjb
        5
    hebwjb  
       277 天前
    好奇什么样的需求要精确到毫秒,通知时间相差 100ms 用户能感知到差距吗
    Danmen123
        6
    Danmen123  
    OP
       277 天前
    @hebwjb 其实应该是 10ms ,是有一个搞运动的要求的,我自己本身也觉的这种精度貌似没必要,但是有用户有这个需求,我就做了,如果 iOS 做不到的话,其实隐藏这个功能就好了
    Danmen123
        7
    Danmen123  
    OP
       277 天前
    @fds 没办法,需要做各种个性化的提醒,所以必须在后台运行,比如每隔几秒中需要播放一个音频文件提醒一下这样的需求,如果仅仅是在计时器结束的时候发送一个通知的花,也没必要使用我们软件了,直接用手机系统自带的计时器更好用还节省资源呢
    finab
        8
    finab  
       277 天前
    没有人需要 10ms 精度的提醒,CS 职业选手架枪的反应时间都 100-200ms 了。

    就算你完全后台运行,给你 0 延迟弹提醒,手机弹出提醒框都 500ms 过去了。
    建议梳理下真正的需求
    finab
        9
    finab  
       277 天前
    另外眨眼都要 200ms ,闹麻了
    Danmen123
        10
    Danmen123  
    OP
       277 天前
    @finab 按照你这么说,那些秒表什么的就不需要了。
    Danmen123
        11
    Danmen123  
    OP
       277 天前
    @finab 我们软件的需求都是真实用户反馈的。不是我们自己在脑海里面冥思苦想的假需求。比如这个毫秒级别,其实无论是 10 毫秒还是 100 毫秒,这个都是真实存在的,尤其是我们的运动方面的用户,都反馈过这个需求。至于你说的眨眼 200 毫秒的问题,在给运动员测量每一次跑步或者每一次有用的时间,是允许测量的人眨眼的,且不会影响测量结果。
    finab
        12
    finab  
       277 天前   2
    @Danmen123
    你功能可以精确到毫秒,但是提醒是不需要精确到毫秒的

    举个例子,现在假如你能在后台发送提醒,并且没有延迟。
    你觉得发出的这个通知提醒,从 iPhone 亮屏(或从屏幕上面弹出),到用户眼睛看到,读取,再到大脑处理,过去了多少毫秒呢? 这个场景去扣 10ms 的精度有意义么
    finab
        13
    finab  
       277 天前
    虽然我没测试过,但本地通知的触发定时用的是 TimeInterval ,本质是 Double, 传小数应该是支持毫秒。
    不管有没有用吧,给你说一下
    yjw06282
        14
    yjw06282  
       277 天前
    非高刷屏
    最常见刷新率 60ms
    显示器刷新间隔就得 1000/60 = 16.6ms
    你的 10ms 延迟已经突破物理极限了
    Danmen123
        15
    Danmen123  
    OP
       277 天前
    @finab 精度是由倒计时器的具体算法实现的,提醒只是在时间结束时候触发
    sunshinez1128
        16
    sunshinez1128  
       277 天前   1
    楼主直接刚客户就可以了,什么需求需要精确到 10ms,真有这个需求让客户直接用实时操作系统,现在的所有通用操作系统都不能保证 10ms 必须响应,也就是说通知想精确到 10ms 在操作系统层面无论是安卓还是苹果的内核调度系统都无法实现,直接硬刚客户,不同需求就不要提。
    LitterL
        17
    LitterL  
       277 天前
    如果是回到后台,手机没有任何 UI 的显示,那可以在进入后台的时候生成一个时间戳,然后再进入前台的时候在生成时间戳,两者得到差值,更新 UI 显示

    如果是回到后台,手机有 UI 的显示,比如有悬浮框,你可以用到 backgroundMode 的东西,RunLoop.main.add(timer, forMode: .common),进行操作

    希望能够帮助到你
    Danmen123
        18
    Danmen123  
    OP
       277 天前
    Danmen123
        19
    Danmen123  
    OP
       277 天前
    @finab 感谢~
    zhanglihow
        20
    zhanglihow  
       277 天前
    其实不是要用到后台计时,是用到闹钟,Android 上面用闹钟就可实现,iOS 同理
    Building
        21
    Building  
       277 天前
    开启灵动岛实时活动就可以了,显示的时候 Text(startDate, style: .timer)
    ethusdt
        22
    ethusdt  
       277 天前 via iPhone
    昨天在推特上刷到了一个视频,他做了一个 demo 完全是你说的这个需求,切到后台再切回来时间不会被中断,找了下没有再找到这条推。
    wyfig
        23
    wyfig  
       277 天前 via iPhone
    精确那么多没有必要。联网的话好解决,比如加个长链接,通过心跳发送服务器时间。在应用 resume 的时候通过长链接或者 http 请求当前时间,就可以计算出来期间过去多久了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2613 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 03:25 PVG 11:25 LAX 20:25 JFK 23:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86