9

更新:我尝试将时间轴上的策略设置为.atEnd,因为只有一个条目。这并没有什么不同。我在 RSS Parser 文件和 AppDelegate 中都尝试过运行 WidgetCenterreloadAllTimeLines方法,但它也什么也没做。这让我发疯了,我将不得不使用开发人员支持票来解决这个问题。

我正在慢慢地让我的应用程序为一些 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 本身上工作正常。

4

5 回答 5

7

iOS 正在处理时间线执行,它不会立即显示。我检查了你的代码,一切似乎都很好。我正在构建一个类似的应用程序,一切正常。我有几乎相同的代码。我有 API 命中测试,它似乎每 10-20 分钟刷新一次小部件。至少在我的情况下。

我会把它作为.atEnd时间线政策。

每个配置的小部件每天都会收到有限数量的刷新。有几个因素会影响小部件接收的刷新次数,例如包含应用程序是在前台还是后台运行、小部件在屏幕上显示的频率以及包含应用程序参与的活动类型。

在 Xcode 中调试小部件时,WidgetKit 不会施加此限制。要验证您的小部件的行为是否正确,请在 Xcode 的调试器之外测试您的应用程序和小部件的行为。资源

您是否尝试调试它?你的结果是什么?

你可以尝试测试一些已经命中测试的 API,这样你就可以检查 API 被命中了多少次?

编辑:如果您想在添加新闻文章后立即更新您的小部件,那么您将需要实施将强制刷新小部件的通知。

EDIT2:我发现有时我的小部件在初始刷新后不会刷新,并且在屏幕上删除和添加小部件解决了这个问题。我认为只有在开发/调试时才会出现这个问题。

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

于 2020-10-01T15:09:47.477 回答
2
 WidgetCenter.shared.reloadTimelines(ofKind: "Widgets")

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

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

于 2021-02-22T11:50:39.147 回答
1

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

每分钟更新一次太激进了。小部件的更新数量有限,如果您尝试每分钟更新一次,您将很快用完更新。在使用 Xcode 进行调试时,不会施加这些限制,但是如果您在 Xcode 之外运行您的应用程序,您会看到您所描述的小部件将停止更新的行为。
如果您每 15 分钟更新一次会发生什么?如果这不起作用,请提交反馈助理报告,其中包含您正在执行的操作的详细信息以及您看到的结果。

于 2020-10-15T13:57:53.307 回答
0

尝试在您的一个视图文件中使用 .onChange 函数。如果您的 SimpleEntry 数组有任何更改,您可以调用 WidgetCenter.shared.reloadAllTimelines()。

它可能看起来像:

.onChange(of: simpleEntryArray.count) { change in 
      // some code to save your changes
      WidgetCenter.shared.reloadAllTimelines()
}
于 2021-09-20T07:52:37.073 回答
-1

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

var urlRequest = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData)
于 2021-05-04T11:36:19.503 回答