【问题标题】:Communication between iOS app & Widgets for iOS 14iOS 应用程序和 iOS 14 小部件之间的通信
【发布时间】:2020-11-14 00:29:33
【问题描述】:

我目前正在为我的应用程序创建我的第一个小部件。 数据是通过 API 调用获得的。我想知道是否可以从应用程序发出此请求,然后将此请求的结果发送到小部件? (有点像 WatchConnectivity 对手表的作用)

感谢您的帮助:-)

【问题讨论】:

标签: swiftui widgetkit


【解决方案1】:

通常小部件不应该直接从应用程序接收任何数据。小部件有一个TimelineProvider 的概念,它生成一个由时间线条目组成的时间线。每个条目都指定更新小部件内容和内容本身的日期和时间。如果需要从服务器获取内容,您可以在时间线提供者的方法中使用标准的URLSession API,并将数据附加到时间线条目。这就是为什么时间线提供者在其方法中将完成处理程序作为参数:

func getTimeline(in: Self.Context, completion: (Timeline<Self.Entry>) -> Void)

WidgerCenter API(recloadAllTimelines()reloadTimelines(ofKind:))应该用于通知WidgetKit 当时间线发生变化时。例如,当用户在主应用程序中更改某些内容,向后端发送请求,使用新信息更新数据库时,您需要启动小部件更新以及获取更新的数据并刷新。

【讨论】:

    【解决方案2】:

    是的,这可以使用WidgetCenter API 之一重新加载您的时间线。

    ...
    // make API call
    // store data in shared storage that the Widget uses
    
    
    WidgetCenter.shared.reloadAllTimelines()
    // OR
    WidgetCenter.shared.reloadTimelines(ofKind: "WidgetKind")
    
    

    请注意,最有可能使用reloadTimelines(ofKind: "WidgetKind"),因为它只会重新加载特定小部件的时间线。 “WidgetKind”可以在您的 WidgetConfiguration 定义中找到

    【讨论】:

    • 我不确定这个公认的答案是否真的回答了这个问题。或者至少我从这个问题中了解到的是,该人通过 API 调用请求数据,然后他想将该数据从主应用程序发送到 widgetExtension,以便他可以将其显示在他的小部件上。
    • 只要开发人员使用应用程序组将 API 调用中的数据存储在共享存储中,就可以处理这种情况。小部件不是不断运行的进程,所以我不相信有一种方法可以在不使用共享存储的情况下将数据从应用程序“发送”到小部件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2017-12-19
    • 1970-01-01
    • 2020-10-18
    • 2021-03-05
    相关资源
    最近更新 更多