You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS Widget计时1分钟后停止计数问题求助

秒数计时Widget的Timeline优化方案

你的代码核心问题是生成了过多的Timeline条目,同时依赖.atEnd策略导致刷新时机不符合预期。系统对Widget的资源占用和刷新频率有严格限制,大量条目会被系统过滤,调大数值只会加重资源负担,让Widget更难正常刷新。

正确实现思路

不需要提前生成未来几十上百个条目,只需要生成当前和下一秒的条目,然后让系统在下一秒自动请求新的Timeline,以此实现每秒更新的效果。这种方式既符合系统规则,又能保证计时的准确性。

修正后的代码

struct Provider: TimelineProvider {
    func placeholder(in context: Context) -> SecondsEntry {
        SecondsEntry(date: Date())
    }

    func getSnapshot(in context: Context, completion: @escaping (SecondsEntry) -> ()) {
        let entry = SecondsEntry(date: Date())
        completion(entry)
    }
        
    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        let currentDate = Date()
        // 创建当前时间的条目
        let currentEntry = SecondsEntry(date: currentDate)
        
        // 计算下一秒的时间点
        guard let nextSecondDate = Calendar.current.date(byAdding: .second, value: 1, to: currentDate) else {
            // 异常情况:无法计算下一秒,只返回当前条目且不自动刷新
            completion(Timeline(entries: [currentEntry], policy: .never))
            return
        }
        
        // 仅保留当前和下一秒的两个条目,减少资源消耗
        let entries = [currentEntry, SecondsEntry(date: nextSecondDate)]
        
        // 设置刷新策略:在下一秒时间点之后自动请求新的Timeline
        let timeline = Timeline(entries: entries, policy: .after(nextSecondDate))
        completion(timeline)
    }
}

关键说明

  1. 条目数量控制:每次只生成2个条目,避免系统因条目过多拒绝处理。
  2. 刷新策略调整:使用.after(nextSecondDate)替代.atEnd,让系统在指定时间点主动触发下一次getTimeline调用,保证每秒更新的节奏。
  3. 系统限制兼容:Widget的最终刷新频率由系统调度,低电量、后台资源紧张时可能会自动降低频率,这是正常的系统优化行为,无法强制突破。

内容的提问来源于stack exchange,提问作者WilliApple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:24:32