[英]iOS 14 Widget Not Refreshing
更新:我尝试将时间线上的策略设置为.atEnd
,因为只有一个条目。 这没有任何区别。 我在 RSS 解析器文件和 AppDelegate 中都尝试过运行 WidgetCenter reloadAllTimeLines
方法,但它也没有做任何事情。 这让我发疯了,我将不得不使用开发人员支持票来解决这个问题。
我正在慢慢为 iOS 14 的某些功能准备好我的应用程序,但不断遇到一个又一个错误,或者(更有可能)我没有正确地做事。 我正在尽我所能让小部件更新,但它不会。 小部件本身很简单; 它显示来自 RSS 提要的最新条目的标题和一些文本。 我构建了一个 XMLParser,此代码针对时间线运行:
struct Provider: TimelineProvider {
@State private var rssItems:[RSSItem]?
let feedParser = FeedParser()
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date(), title:"News", description: "News article here", link: "Http://link", pubDate: "The day it posted")
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date(), title:"News", description: "News Article Here", link: "Http://link", pubDate: "The day it posted")
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> ()) {
WidgetCenter.shared.reloadAllTimelines()
var entries: [SimpleEntry] = []
feedParser.parseFeed(url: "https://fritchcoc.wordpress.com/feed") {(rssItems) in
self.rssItems = rssItems
let currentDate = Date()
let string1 = "Latest News: \n\n"
let string2 = rssItems[0].title
var appendString1 = string1+string2
let entry = SimpleEntry(date: currentDate, title:appendString1, description: rssItems[0].description, link: rssItems[0].link, pubDate: rssItems[0].pubDate)
entries.append(entry)
let refreshDate = Calendar.current.date(byAdding: .minute, value: 2, to: Date())!
let timeline = Timeline(entries: entries, policy: .after(refreshDate))
completion(timeline)
}
}
}
当您第一次安装小部件时,它会正确显示最新的新闻项目。 但是,我向 RSS 提要添加了更多条目以对其进行测试,并且它从不更新以显示这些更改,仅显示安装时的新条目。 我安装在第二台设备上,在第二台设备上,它确实显示了我为测试添加的新设备,所以我知道它在解析器端和 RSS 本身上正常工作。
iOS 正在处理时间线执行,它不会立即显示它。 我检查了你的代码,一切似乎都很好。 我正在构建一个类似的应用程序,一切正常。 我有几乎相同的代码。 我有 API 命中测试,它似乎每 10-20 分钟刷新一次小部件。 至少在我的情况下。
我会把它作为.atEnd
时间线政策。
每个配置的小部件每天都会收到有限数量的刷新。 有几个因素会影响小部件接收的刷新次数,例如包含的应用程序是在前台还是后台运行、小部件在屏幕上显示的频率以及包含的应用程序参与的活动类型。
在 Xcode 中调试小部件时,WidgetKit 不会强加此限制。 要验证您的小部件行为是否正确,请在 Xcode 调试器之外测试您的应用程序和小部件的行为。 来源
你试过调试吗? 你的结果如何?
您可以尝试测试一些已命中测试的 API,以便检查 API 被命中的次数吗?
编辑:如果您想在添加新闻文章后立即更新您的小部件,那么您将需要实施强制刷新小部件的通知。
EDIT2:我发现有时我的小部件在初始刷新和删除小部件并将其添加到屏幕后不会刷新解决了该问题。 我认为这是只有在开发/调试时才会出现的问题。
EDIT3:从WidgetCenter.shared.reloadAllTimelines()
删除getTimeline()
。 构建项目并运行它。 检查控制台日志,您应该在每个请求上打印一些内容。 它应该在接下来的几分钟内触发。
https://developer.apple.com/forums/thread/653265?answerId=619739022#619739022
每分钟更新一次太激进了。 小部件的更新数量有限,如果您尝试每分钟更新一次,更新很快就会用完。 在使用 Xcode 进行调试时,不会施加这些限制,但是如果您在 Xcode 之外运行您的应用程序,您会看到您描述的小部件将在何处停止更新的行为。
如果每 15 分钟更新一次会发生什么? 如果这不起作用,请提交一份反馈助理报告,详细说明您正在做什么以及您看到的结果。
WidgetCenter.shared.reloadTimelines(ofKind: "Widgets")
如果您不在后台模式功能中检查后台获取,则将无法工作
我花了一个星期才找到它!
发现 iOS 14 小部件未在我的应用程序中刷新的问题是由 URLRequest 的默认缓存策略引起的。 默认情况下,正在使用缓存而不是从服务器请求新数据。 JSON 是从缓存数据加载的。 将此 cachePolicy 参数添加到 URLRequest "cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData" 后,小部件开始正确更新并显示来自服务器的正确最新数据。
var urlRequest = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData)
尝试在您的视图文件之一中使用 .onChange 函数。 如果您的 SimpleEntry 数组有任何更改,您可以调用 WidgetCenter.shared.reloadAllTimelines()。
它可能看起来像:
.onChange(of: simpleEntryArray.count) { change in
// some code to save your changes
WidgetCenter.shared.reloadAllTimelines()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.