ios14 - 即使 UserDefaults 同步,小部件也不会更新
问题描述
我正在使用 XCode 12 beta 2 (iOS 14 Sim) 将数据从我的应用程序传递到使用 AppContainer 的小部件。
我正在使用以下代码将数据(此处为字符串)保存到应用程序容器。
let userDefaults = UserDefaults(suiteName: "group.abc.WidgetDemo")
userDefaults?.setValue(status, forKey: "widget")
userDefaults?.synchronize()
在 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)
}
}
请注意:时间线条目是当前日期后 10 秒。
即使延迟了 10 秒,我也无法在小部件中看到更新的信息。
解决方案
显然,在阅读了文档之后,我碰巧通过使用以下内容使其工作
WidgetCenter.shared.reloadTimelines(ofKind: "WidgetDemo")
但如果有时上述方法不起作用,我会尝试重新加载所有时间线。
WidgetCenter.shared.reloadAllTimelines()
请注意:重新加载时间线代码写在我们传输数据的源文件中。
推荐阅读
- groovy - 使用 groovy 脚本执行带参数的 shell 脚本
- sql - 如何加入两个表来查找转机航班?
- javascript - 实现了任何 HTML 元素的固定宽度和高度
- html - CSS动画在播放后不会停留在原地,即使在添加一次迭代后也会播放多次
- android - 如何获取在 .js 文件中返回的 WebView 响应?
- python-3.x - python中的目标编程,为什么我将属性初始化为“none”?
- arrays - 将 arraylist 中的特定值添加到另一个 arraylist
- python - object.__init__() 不带参数
- spring - CDI 中的 Spring Data JPA - ResourceLoader 不能为空
- java - 线程“main”中的异常 java.lang.RuntimeException 问题与公共静态 void