iOS 14小部件后台刷新未发生-如何获取诊断/刷新预算计数器信息?

iOS 14小部件后台刷新未发生-如何获取诊断/刷新预算计数器信息?,ios,swift,widget,ios14,widgetkit,Ios,Swift,Widget,Ios14,Widgetkit,我们正在尝试在应用程序达到给定状态后的10小时内,每小时更新家庭小部件4到5次(我们无法准确预测何时会发生这种情况) 当应用程序在前台时,一切正常,并且正如预期的那样,应用程序在后台但是,小部件可能每小时刷新一次,或者根本不刷新(后台处理已启用且工作正常)。这感觉完全是随机的,目前我们无法追溯或理解正在发生的事情或为什么会发生 这是我们的TimelineProvider: struct Provider: TimelineProvider { func getSnapshot(in co

我们正在尝试在应用程序达到给定状态后的10小时内,每小时更新家庭小部件4到5次(我们无法准确预测何时会发生这种情况)

当应用程序在前台时,一切正常,并且正如预期的那样,应用程序在后台但是,小部件可能每小时刷新一次,或者根本不刷新(后台处理已启用且工作正常)。这感觉完全是随机的,目前我们无法追溯或理解正在发生的事情或为什么会发生

这是我们的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)
        }
    }
}
结构提供程序:TimelineProvider{ func getSnapshot(在上下文:context中,完成:@escaping(SimpleEntry)->Void){ 让首选项=UserDefaults.init(suiteName:widgetGroupId) let title=首选项?.string(forKey:“title”) let entry=SimpleEntry(日期:date(),标题:title??) 完成(进入) } func占位符(在上下文中:context)->SimpleEntry{ ... } func getTimeline(在上下文中:上下文,完成:@escaping(Timeline)->()){ getSnapshot(在:上下文中){(条目)在 让时间线=时间线(条目:[条目],策略:。从不) 完成(时间表) } } } 我们的应用程序尝试通过
WidgetCenter.shared.reloadAllTimelines()
更新home小部件

我现在有以下问题:

  • 我如何理解刷新不起作用的原因以及何时可以再次刷新?有没有冷却时间
  • 如何检查刷新预算计数器?我们能在代码中找到它吗
  • 如何重置测试的预算计数器?我要重新创建小部件吗?重启手机?重新安装应用程序

  • 根据我的经验,除了前台应用之外,在任何地方调用reloadAllTimelines()似乎都不可靠。不要将时间线过期策略设置为。从不,尝试使用。after,并在未来15分钟左右指定日期。这将确保您的小部件每小时更新4次最新数据。希望这对于您的用例来说足够接近