ios - iOS 14 小部件背景刷新未发生 - 如何获取诊断/刷新预算计数器信息?
问题描述
在我们的应用程序达到给定状态后,我们尝试在每天 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)
}
}
}
我们的应用程序尝试通过WidgetCenter.shared.reloadAllTimelines()
.
我现在有以下问题:
- 我如何理解为什么刷新不起作用以及何时可以再次刷新?有没有冷却时间之类的东西?
- 如何查看刷新预算计数器?我们可以在代码中以某种方式获得它吗?
- 如何重置预算计数器以进行测试?我要重新创建小部件吗?重启手机?重新安装应用程序?
解决方案
根据我的经验,从前台应用程序以外的任何地方调用 reloadAllTimelines() 似乎都不可靠。与其将时间线过期策略设置为 .never,不如尝试使用 .after 并在未来 15 分钟左右设置日期。这应该确保您的小部件每小时更新约 4 次最新数据。希望这对于您的用例来说已经足够接近了。
推荐阅读
- web-applications - 网站如何确定信用卡号是否有效?
- ios - 忽略 R.Swift 中的 segue 资源
- redis - 为什么我在redis中设置了requirepass密码后它不起作用?
- c# - 是否可以使用控制台应用程序作为 selenium webscraper 的传递来获取值并将其传递回主程序?
- python - 在python中有效地使用条件语句而不是字典
- python - 如何在 Python 中转换大写名称?
- c# - Azure 事件网格订阅 VM 上的控制台应用程序
- javascript - JS while循环不会停止在true
- android - 使用 URL 方案的 Google Pay UPI 集成 - iOS
- arrays - Azure 逻辑应用程序,从提取存档到文件夹 FTP 连接器的数组中设置对象变量