如何在通知中心频繁更新今日小部件?
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
函数在每次显示小部件时都会被调用,因此您可以在该方法中调用更新函数。或者,您可以将需要在小部件中显示的任何更新放在该函数内,尽管我不知道这会对应用性能产生什么样的影响。
希望这会有所帮助。
更新
我还发现 initWithCoder
或 initWithNibName
中的任何一个似乎都会在每次小部件显示在屏幕上时被调用,因此您可以在这些文件中调用更新小部件,但是如果我没记错的话,此时视图实际上并没有被实例化,所以最好不要把你的代码更新到这些函数中。
【讨论】:
【参考方案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);
【讨论】:
以上是关于如何在通知中心频繁更新今日小部件?的主要内容,如果未能解决你的问题,请参考以下文章