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

问题描述

我有一个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

这会导致不良的UX

UserDefaults中更改配置后,如何立即刷新窗口小部件内容

感谢您的支持

解决方法

Keeping a Widget Up to Date by Apple中,要通知您的小部件更新其时间轴和其内容,请致电:

WidgetCenter.shared.reloadAllTimelines()

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

,

为阐明整个工作流程,我在此处添加一些说明:

您不仅可以从WidgetCenter来调用widget,而且可以从您的主应用程序中调用。

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

所以流程是:

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

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

  3. MainApp触发重新加载窗口小部件,方法是:

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

    您可以通过查看窗口小部件条目文件来获得kind

    @main
    struct mone24h_widget: Widget {
       let kind: String = "mone24h_widget"
    
  4. 小部件将重新加载时间线,我将从此处的UserDefaults获取共享数据。完成工作。例如:根据MainApp传递的安排重新渲染我的股票清单

,

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

react-native-widget-bridge