如何在iOS 14 Home Widget中显示当前时间实时

问题描述

我正在为ios 14 Home Widget开发一个应用程序,并且在显示当前时间(数字时钟)时该小部件没有每秒更新时遇到一个问题。众所周知,Apple不允许每秒触发时间轴,是否还有其他方法可以通过实时更新显示当前时间?

我尝试了这些方法,但无法正常工作

setosa

解决方法

不允许您每秒刷新小部件 。那是Apple的限制。

您能做的就是以 seconds 显示日期 使用timer日期样式:

/// A style displaying a date as timer counting from now.
///
///     Text(event.startDate,style: .timer)
///
/// Example output:
///    2:32
///    36:59:01
public static let timer: Text.DateStyle

  1. 您需要一个具有Entry属性的简单Date
struct SimpleEntry: TimelineEntry {
    let date: Date
}
  1. Entry中传递给定日期的午夜日期,并在下一个午夜之后刷新时间轴:
struct SimpleProvider: TimelineProvider {
    ...

    func getTimeline(in context: Context,completion: @escaping (Timeline<Entry>) -> Void) {
        let midnight = Calendar.current.startOfDay(for: Date())
        let nextMidnight = Calendar.current.date(byAdding: .day,value: 1,to: midnight)!
        let entries = [SimpleEntry(date: midnight)]
        let timeline = Timeline(entries: entries,policy: .after(nextMidnight))
        completion(timeline)
    }
}
  1. 使用timer样式显示日期:
struct SimpleWidgetEntryView: View {
    var entry: SimpleProvider.Entry

    var body: some View {
        Text(entry.date,style: .timer)
    }
}

请注意,当刷新时间轴(通过指定TimelineReloadPolicy或调用WidgetCenter)时,您设置了最早时间 的时间窗口小部件将会刷新。

不能保证在特定时间刷新