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

SwiftUI Widget 每小时定时刷新失效 仅手动改时间可更新问题求助

问题原因分析
  • 预生成全天静态Entry逻辑不符合动态刷新要求:你当前的代码一次性生成了当日0点到23点共24条静态Entry,系统只会按给定的Entry列表按时间切换展示内容,不会在整点触发新的getTimeline调用,仅会在所有24条Entry全部展示完毕(即当日23点过后)才会重新请求新的Timeline。如果你的Widget内容需要每小时动态计算/拉取最新数据,预生成静态Entry的方式无法满足需求。
  • 刷新策略配置错误:你使用的.atEnd刷新策略的触发时机是Timeline内所有Entry都被消耗完成后,和你预期的每小时刷新的需求不匹配。
  • 仅修改系统时间会触发刷新的原因:手动修改系统时间会触发系统对所有当前展示的Widget进行全量时间校验,强制匹配对应时间点的Entry,所以会出现修改时间后才更新的现象。
修复方案

如果你需要每小时触发一次getTimeline拉取最新数据生成最新内容,修改代码如下:

func getTimeline(for configuration: MyWidgetSelectionIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
    let currentDate = Date()
    // 生成当前小时的Entry
    let entry = SimpleEntry(date: currentDate, configuration: configuration)
    // 计算下一个整点时间作为刷新触发时间
    let nextHour = Calendar.current.date(byAdding: .hour, value: 1, to: currentDate)!
    let nextRefreshDate = Calendar.current.date(bySetting: .minute, value: 0, of: nextHour)!
    // 使用after策略指定下一次刷新时间
    let timeline = Timeline(entries: [entry], policy: .after(nextRefreshDate))
    completion(timeline)
}
额外注意事项
  • 不要一次性生成过多Entry,系统对Widget的Timeline Entry数量有资源限制,最高不要超过100条,且预生成的Entry均为生成时的静态数据,不适合需要动态更新的内容场景。
  • 系统对Widget刷新频率有节流限制,普通Widget每日刷新额度约为40-70次,每小时一次的刷新频率完全在系统限制范围内,不会被拦截。
  • 如果你的Widget内容不需要每小时动态获取,仅需要展示对应小时的固定内容,可以保留预生成24条Entry的逻辑,但需要确保生成Entry时已经把对应小时的所有展示内容提前计算好写入SimpleEntry的属性中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:54:03