iOS 14个Widget每天自动刷新
iOS 14 Widget auto-refresh every day
我已经试用了新的 iOS 14 个小部件,似乎工作正常,除了自动刷新。我的目标是让我的小部件在每个午夜刷新一次(因此,每天只刷新一次,当然偶尔在我的应用程序中发生某些事情时刷新)。在 XCode 中,我尝试将其设置为每分钟刷新一次,并且似乎非常随机地工作 - 所以它可能在我测试的 10 分钟内刷新一次,但我想,这没关系,因为我读到刷新是由 [=30= 处理的] 所以迟早会来,但终究会来。
现在,我已经发布了我的应用程序的这个版本,今天早上(早上 8 点左右,午夜过后)我检查了我的小部件,但今天没有更新。
我的问题是,我做错了什么吗?还是还不够稳定?
我的时间线仅包含一项 date: now
并且刷新策略设置为 .after(nextMidnight)
。
我也尝试过使用刷新策略 .atEnd
,但是由于我在时间轴中只有一个项目设置为现在,它不会尝试连续刷新吗?我想,.after
是更好的方法。
如果相关的话,它是StaticConfiguration
而不是IntentConfiguration
(老实说,我仍然要深入研究这里的区别是什么......)。
代码片段:
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
let now = Date()
let calendar = Calendar.current
var dateComponents = DateComponents()
dateComponents.year = calendar.component(.year, from: now)
dateComponents.month = calendar.component(.month, from: now)
dateComponents.day = calendar.component(.day, from: now) + 1
dateComponents.hour = 0
dateComponents.minute = 0
dateComponents.second = 0
let nextUpdate = calendar.date(from: dateComponents)
completion(Timeline(entries: [SimpleEntry(date: now)], policy: .after(nextUpdate!)))
}
其实好像是我疏忽了,widget居然刷新了,是我自己没有刷新数据。 (我正在使用 UserDefaults 在我的应用程序和小部件之间共享数据,即使小部件正确刷新,但由于 UserDefaults 中的数据未更新,同样的内容会一遍又一遍地显示。)
这应该可以为您节省几行代码:
let nextUpdate = Calendar.autoupdatingCurrent.date(byAdding: .day, value: 1, to: Calendar.autoupdatingCurrent.startOfDay(for: Date()))!
我已经试用了新的 iOS 14 个小部件,似乎工作正常,除了自动刷新。我的目标是让我的小部件在每个午夜刷新一次(因此,每天只刷新一次,当然偶尔在我的应用程序中发生某些事情时刷新)。在 XCode 中,我尝试将其设置为每分钟刷新一次,并且似乎非常随机地工作 - 所以它可能在我测试的 10 分钟内刷新一次,但我想,这没关系,因为我读到刷新是由 [=30= 处理的] 所以迟早会来,但终究会来。
现在,我已经发布了我的应用程序的这个版本,今天早上(早上 8 点左右,午夜过后)我检查了我的小部件,但今天没有更新。
我的问题是,我做错了什么吗?还是还不够稳定?
我的时间线仅包含一项 date: now
并且刷新策略设置为 .after(nextMidnight)
。
我也尝试过使用刷新策略 .atEnd
,但是由于我在时间轴中只有一个项目设置为现在,它不会尝试连续刷新吗?我想,.after
是更好的方法。
如果相关的话,它是StaticConfiguration
而不是IntentConfiguration
(老实说,我仍然要深入研究这里的区别是什么......)。
代码片段:
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
let now = Date()
let calendar = Calendar.current
var dateComponents = DateComponents()
dateComponents.year = calendar.component(.year, from: now)
dateComponents.month = calendar.component(.month, from: now)
dateComponents.day = calendar.component(.day, from: now) + 1
dateComponents.hour = 0
dateComponents.minute = 0
dateComponents.second = 0
let nextUpdate = calendar.date(from: dateComponents)
completion(Timeline(entries: [SimpleEntry(date: now)], policy: .after(nextUpdate!)))
}
其实好像是我疏忽了,widget居然刷新了,是我自己没有刷新数据。 (我正在使用 UserDefaults 在我的应用程序和小部件之间共享数据,即使小部件正确刷新,但由于 UserDefaults 中的数据未更新,同样的内容会一遍又一遍地显示。)
这应该可以为您节省几行代码:
let nextUpdate = Calendar.autoupdatingCurrent.date(byAdding: .day, value: 1, to: Calendar.autoupdatingCurrent.startOfDay(for: Date()))!