如何在通知中心频繁更新今日小部件?

Posted

技术标签:

【中文标题】如何在通知中心频繁更新今日小部件?【英文标题】:How to frequently update today widget in notification center? 【发布时间】:2015-05-03 01:54:14 【问题描述】:

我发现我的通知中心小部件不会经常重新加载。正因为如此,提供了过时的数据。每次打开“今天”视图时,我都无法找到让小部件刷新的方法。我见过诸如 NBA Gametime 之类的应用程序,每次我下拉查看小部件时都能更新。

如何在我的应用中获得此功能?

【问题讨论】:

【参考方案1】:

根据我自己的实验以及this SO thread 中的报告,似乎每次打开今日/通知区域时都会调用TodayViewController.viewDidLoad() 函数。更具体地说,@Karl Monaghan 在评论中报告说 ios 8.1 发行说明有以下内容:

widgetPerformUpdateWithCompletionHandler: 的计划和预期用途旨在作为所有数据/模型更新逻辑的方便归宿。如果实施,系统将在适当的时候调用小部件以更新其状态,无论是在通知中心可见时还是在后台。需要一个实现来启用后台更新。预计小部件将执行异步更新工作,并尽可能脱离主线程。

所以,回答你的问题:

    我认为我们永远不会真正知道 widgetPerformUpdateWithCompletionHandler 方法被调用的频率,我认为 Apple 更喜欢这种方式 viewDidLoad 函数在每次显示小部件时都会被调用,因此您可以在该方法中调用更新函数。或者,您可以将需要在小部件中显示的任何更新放在该函数内,尽管我不知道这会对应用性能产生什么样的影响。

希望这会有所帮助。

更新

我还发现 initWithCoderinitWithNibName 中的任何一个似乎都会在每次小部件显示在屏幕上时被调用,因此您可以在这些文件中调用更新小部件,但是如果我没记错的话,此时视图实际上并没有被实例化,所以最好不要把你的代码更新到这些函数中。

【讨论】:

【参考方案2】:

在您的widgetPerformUpdateWithCompletionHandler 中,您需要让您的小部件知道它需要更新。 Apple Docs

-(void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler 
    // Perform any setup necessary in order to update the view.

    // If an error is encoutered, use NCUpdateResultFailed
    // If there's no update required, use NCUpdateResultNoData
    // If there's an update, use NCUpdateResultNewData

    completionHandler(NCUpdateResultNewData);

【讨论】:

以上是关于如何在通知中心频繁更新今日小部件?的主要内容,如果未能解决你的问题,请参考以下文章

在哪里只更新一次通知小部件的 UI

iPad 通知中心小部件无响应

iOS 8 移除今日扩展

使用自动布局正确对齐通知中心小部件中的元素

今日 iOS 小部件仅在调试时显示

如何为通知中心全宽制作 iOS 应用扩展?