V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Danmen123
V2EX  ›  程序员

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

  •  
  •   Danmen123 · 3 天前 · 1518 次点击

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

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

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

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

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

    希望能够帮助到你
    Danmen123
        18
    Danmen123  
    OP
       3 天前
    Danmen123
        19
    Danmen123  
    OP
       3 天前
    @finab 感谢~
    zhanglihow
        20
    zhanglihow  
       3 天前
    其实不是要用到后台计时,是用到闹钟,Android 上面用闹钟就可实现,iOS 同理
    Building
        21
    Building  
       3 天前
    开启灵动岛实时活动就可以了,显示的时候 Text(startDate, style: .timer)
    FaiChou
        22
    FaiChou  
       3 天前 via iPhone
    昨天在推特上刷到了一个视频,他做了一个 demo 完全是你说的这个需求,切到后台再切回来时间不会被中断,找了下没有再找到这条推。
    wyfig
        23
    wyfig  
       3 天前 via iPhone
    精确那么多没有必要。联网的话好解决,比如加个长链接,通过心跳发送服务器时间。在应用 resume 的时候通过长链接或者 http 请求当前时间,就可以计算出来期间过去多久了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1097 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:31 · PVG 07:31 · LAX 15:31 · JFK 18:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.