iOS14 小部件可以请求主应用程序更新其数据吗?

Posted

技术标签:

【中文标题】iOS14 小部件可以请求主应用程序更新其数据吗?【英文标题】:Can iOS14 widget requests main app to update its data? 【发布时间】:2020-10-08 06:21:08 【问题描述】:

我的应用需要最新数据,但主应用可能有旧数据。

所以我想请求主应用更新其数据。

有可能吗?

如果不是,我想知道任何替代方法。

(小部件是否应该向服务器请求最新数据??)

谢谢

=== 更新

我发现了很多教程,它们都使用来自 getTimeline 的 http 请求方法来获取最新数据(而不是来自主应用程序)。这不是我想要的。

有人说在主应用程序和小部件之间共享数据的最简单方法是使用 UserDefaults。但是如果主应用程序不更新用户默认值或使用旧数据更新值,则数据可能是旧的。 (除了服务器数据总是最新的数据)

所以我想知道的是“小部件使主应用程序更新其数据并更新用户默认值并调用reloadTimelines”的方式。所以小部件可以使用最新数据。

【问题讨论】:

【参考方案1】:

Widget 无法告诉其父 App 刷新其数据。

您可以:

直接在 Widget 中获取数据 - 请参阅:How to refresh Widget data? 在应用中启用后台通知(请参阅How to run code when your app is terminated),并在收到通知时强制小部件刷新其时间线,使用:
WidgetCenter.shared.reloadAllTimelines()

实际上,直接在 Widget 中获取数据可能会更好。这样您就可以只获取必要的数据 - 小部件视图通常比应用视图显示的信息少得多。

【讨论】:

经过几天的研究,我从小部件代码中编写了所有服务器通信代码。哈哈。谢谢【参考方案2】:

是的,你可以喜欢这个; 当你创建一个用于小部件更新的 TimelineProvider 时,你必须实现这个函数,

 func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ())

此函数等待创建您的小部件更新时间线。您可以发送请求,响应后,您可以创建时间线并返回 func 的完成。

【讨论】:

谢谢。但我想知道的有点不同。我编辑了我的问题。再次感谢。 Widget 就像您 iPhone 上的一个“独立”应用程序。它不能要求其父应用程序唤醒并获取新数据。您要么直接从小部件获取新数据,要么等到用户打开父应用程序,获取新数据,然后将其保存到UserDefaults(suiteName: "your.suiteName") 是的。现在我很确定如果我真的需要使用最新数据,我必须直接向服务器请求。谢谢

以上是关于iOS14 小部件可以请求主应用程序更新其数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 14 中的主应用程序和小部件之间共享 UserDefaults

通过服务更新 Android 小部件,即执行 http 请求

App Store Connect 是不是会跟踪小部件在 iOS 14 上的安装情况?

主屏幕小部件 BroadcastReceiver 可以监听电话事件吗?

iOS 14四大新功能:哪个是你最期待的?

系统苹果 iOS 14发布:新增桌面小组件画中画APP资源库 | iOS14更新列表出炉,你的手机支持吗?