即使 UserDefaults 同步,小部件也不会更新

Abh*_*edi 7 widgetkit ios14

我正在使用 XCode 12 beta 2 (iOS 14 Sim) 使用 AppContainer 将数据从我的应用程序传递到小部件。

我正在使用以下代码将数据(此处为字符串)保存到应用程序容器。

  let userDefaults = UserDefaults(suiteName: "group.abc.WidgetDemo")
        userDefaults?.setValue(status, forKey: "widget")
        userDefaults?.synchronize()
Run Code Online (Sandbox Code Playgroud)

在 Widget.swift 文件中


struct Provider: TimelineProvider {
    
    @AppStorage("widget", store: UserDefaults(suiteName: "group.abc.WidgetDemo"))
    var status: String = String()

    public func snapshot(with context: Context, completion: @escaping (MyEntry) -> ()) {
        let entry = MyEntry(status: status, date: Date())
        completion(entry)
    }

    public func timeline(with context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
       
        let entryDate = Calendar.current.date(byAdding: .second, value: 10, to: Date())!
        let entry = MyEntry(status: status, date: entryDate)
        let timeline = Timeline(entries: [entry], policy: .atEnd)
        completion(timeline)

    }
}

Run Code Online (Sandbox Code Playgroud)

请注意:时间轴条目是当前日期后 10 秒。

即使延迟了 10 秒,我也无法在小部件中看到更新的信息。

Abh*_*edi 3

显然,在阅读文档后,我碰巧使用以下命令使其工作

       WidgetCenter.shared.reloadTimelines(ofKind: "WidgetDemo")
Run Code Online (Sandbox Code Playgroud)

但如果有时上述方法不起作用,我会尝试重新加载所有时间线。

       WidgetCenter.shared.reloadAllTimelines()
Run Code Online (Sandbox Code Playgroud)

请注意:重新加载时间线代码写入我们传输数据的源文件中。