iOS 14小部件未刷新

时间:2020-09-24 16:09:00

标签: ios swift xcode widget ios14

更新:由于只有一个条目,因此我尝试将时间轴上的策略设置为.atEnd。这并没有改变。我已经在RSS Parser文件和AppDelegate中都尝试过运行WidgetCenter reloadAllTimeLines方法,但是它也无济于事。这真让我发疯,我将不得不使用开发人员支持票证才能解决这个问题。

我正在慢慢为iOS 14的某些功能准备好我的应用程序,但还是会接连出现bug,或者(更可能是)最终无法正确执行操作。我正在尽我所能来使小部件更新,但不会。小部件本身很简单;它显示了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 feed中添加了更多条目来对其进行测试,并且它从不更新以显示这些更改,只有安装时的新内容。我安装在第二台设备上,在第二台设备上,它确实显示了我为测试添加的新设备,因此我知道它在解析器端以及RSS本身上均正常运行。

4 个答案:

答案 0 :(得分:4)

iOS正在处理时间轴执行,并且不会立即显示。我已经检查了您的代码,一切似乎都正常。我正在构建一个类似的应用程序,并且一切正常。我几乎有相同的代码。我有API命中测试,似乎每隔10-20分钟刷新一次小部件。至少就我而言。

我将其作为.atEnd时间轴政策。

每个配置的小部件每天都会收到有限的刷新次数。有几个因素影响小部件的刷新次数 接收,例如包含的应用程序是否正在 前景或背景,小部件在屏幕上显示的频率, 以及包含应用程序的活动类型。

WidgetKit在Xcode中调试窗口小部件时不施加此限制。要验证您的小部件的行为是否正确,请测试您的应用并 小部件在Xcode调试器之外的行为。Source

您尝试调试它吗?你的结果如何?

您可以尝试测试一些经过命中测试的API,以便检查API被命中多少次吗?

编辑:如果要在添加新闻文章后立即更新窗口小部件,则需要实现将强制刷新窗口小部件的通知。

EDIT2:我发现有时我的窗口小部件在初始刷新后无法刷新,并且删除并向屏幕添加窗口小部件可以解决该问题。我认为这是仅在开发/调试时才会发生的问题。

EDIT3:从WidgetCenter.shared.reloadAllTimelines()中删除getTimeline()。生成项目并运行它。检查控制台日志,您应该在每个请求上打印一些内容。它应该在接下来的几分钟内触发。

答案 1 :(得分:1)

https://developer.apple.com/forums/thread/653265?answerId=619739022#619739022

每分钟更新都过于激进。小部件的更新数量有限,如果您尝试每分钟进行更新,则很快就会用光更新。使用Xcode进行调试时,没有施加这些限制,但是,如果您在Xcode之外运行应用程序,则会看到正在描述小部件停止更新的行为。
如果每15分钟更新一次会怎样?如果那行不通,请提交反馈助手报告,其中包含您正在做的事情和看到的结果的详细信息。

答案 2 :(得分:1)

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

如果您不在后台模式功能中检查后台获取将无法工作

我花了一个星期才找到它!

答案 3 :(得分:0)

发现 iOS 14 小部件无法在我的应用程序中刷新的问题是由 URLRequest 的默认缓存策略引起的。默认情况下,正在使用缓存而不是从服务器请求新数据。 JSON 是从缓存数据加载的。将此 cachePolicy 参数添加到 URLRequest "cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData" 后,小部件开始正确更新并显示来自服务器的正确最新数据。

var urlRequest = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData)