问题描述
在我们的应用程序达到给定状态后,我们正在尝试在每天 10 小时内每小时更新 4 到 5 次我们的主页小部件(我们无法预测这种情况何时会发生)。
当应用程序在前台时,一切正常并按预期运行,但是应用程序是否在后台,小部件可能每小时刷新一次或根本不刷新 strong>(后台处理已启用并正常工作)。感觉完全是随机的,目前我们根本无法追溯或理解正在发生的事情或发生的原因。
这是我们的TimelineProvider:
struct Provider: TimelineProvider {
func getSnapshot(in context: Context,completion: @escaping (SimpleEntry) -> Void) {
let preferences = UserDefaults.init(suiteName:widgetGroupId)
let title = preferences?.string(forKey: "title")
let entry = SimpleEntry(date: Date(),title: title ?? "")
completion(entry)
}
func placeholder(in context: Context) -> SimpleEntry {
...
}
func getTimeline(in context: Context,completion: @escaping (Timeline<Entry>) -> ()) {
getSnapshot(in: context) { (entry) in
let timeline = Timeline(entries: [entry],policy: .never)
completion(timeline)
}
}
}
我们的应用程序尝试通过 WidgetCenter.shared.reloadAllTimelines()
更新主页小部件。
我现在有以下问题:
- 我如何理解为什么刷新不起作用以及何时可以再次刷新?是否有冷却时间之类的东西?
- 如何查看刷新预算计数器?我们可以在代码中以某种方式获得它吗?
- 如何重置测试预算计数器?我要重新创建小部件吗?重启手机?重新安装应用?
解决方法
根据我的经验,从任何地方调用 reloadAllTimelines() 但前台应用程序似乎不可靠。不要将您的时间线过期策略设置为 .never,而是尝试使用 .after 和未来 15 分钟左右的日期。这应该确保您的小部件每小时更新约 4 次最新数据。希望这对您的用例来说足够接近。