ios 14 小部件:如何在 UserDefaults 更改后重新加载时间线

ios 14 widget: How to reload timeline after UserDefaults changed

我有一个 ios 14 小部件,每 5 分钟刷新一次

let timeline = Timeline(entries: entries, policy: .atEnd)

entries 取决于我的 MainApp 上的配置。

我使用UserDefaults在MainApp和Widget之间共享数据。

@AppStorage("FollowingCatalog", store: UserDefaults(suiteName: "group.vn.f19.com"))
var catalogItemsData: Data = Data()

我已经根据 UserDefaults 数据成功镜像了小部件内容。但我的问题是我的小部件仅在 .atEnd 政策之后每 5 分钟刷新一次 UI

这会导致糟糕的用户体验

如何在 UserDefaults 中的配置更改后立即刷新小部件内容?

感谢您的支持。

Keeping a Widget Up to Date by Apple 中,要通知您的小部件更新其时间线和内容,您调用:

WidgetCenter.shared.reloadAllTimelines()

这会重新加载您的应用程序拥有的所有小部件。如果您想重新加载特定的小部件(如果您的应用有多种不同的小部件类型),请改用 WidgetCenter.shared.reloadTimelines(ofKind: "com.myApp.myWidget")

为了阐明整个工作流程,我在这里添加一些注释:

您不仅可以从 widget 调用 WidgetCenter,还可以从您的主应用调用。

WidgetCenter.shared.reloadAllTimelines()
WidgetCenter.shared.reloadTimelines(ofKind: "com.myApp.myWidget........")

所以流程是:

  1. 用户在 MainApp 上进行了一些更改,例如:我重新排列了以下列表中的库存项目

  2. MainApp保存数据到UserDefaults,eg:保存列表项顺序

  3. MainApp 触发重新加载小部件:

    WidgetCenter.shared.reloadTimelines(ofKind: "mone24h_widget")
    

    您可以通过查看您的小部件条目文件来获取 kind

    @main
    struct mone24h_widget: Widget {
       let kind: String = "mone24h_widget"
    
  4. Widget 会重新加载时间线,我会从UserDefaults这里获取共享数据。完成工作。例如:Re-render 我的股票列表基于从 MainApp 传递的安排

顺便说一句,如果您使用的是 react-native,我已经创建了一个模块来支持这个问题:

react-native-widget-bridge