iOS小部件后台更新

12

根据苹果关于widgetPerformUpdateWithCompletionHandler:的说法,iOs Widget可以在widget不可见时更新其内容。

在我的调试会话中,我注意到todayViewController每次通知中心视图消失时都会被释放,所以我的问题是:

如果todayViewController被释放了,它如何响应widgetPerfomrUpdateWithComplationHandler?

我需要每小时更新一次小部件的内容,即使它不可见,我该怎么做?

iOs小部件的生命周期是如何的?

请帮帮我:)谢谢

3个回答

18

iOS本身管理小部件的生命周期。

当你进入后台时,系统会对今天的小部件进行快照。系统管理小部件的后台获取(小部件的后台生命周期),它会尽可能地调用widgetPerfomrUpdateWithComplationHandler:来更新小部件数据并每次拍摄快照。当你再次打开它时,它将首先加载最新的快照,然后加载实时数据。


小部件内容更新

更新内容

Today扩展点提供了管理小部件状态和处理其内容更新的API(可以在“通知中心框架参考”中阅读有关此API的信息)。虽然在Today API中存在一些平台特定差异,但在两个平台上支持的功能大部分相同。

为了使你的小部件看起来是最新的,系统会偶尔捕获你的小部件视图的快照。当小部件再次可见时,将显示最新的快照,直到系统用视图的实时版本替换它。

要在拍摄快照之前更新小部件状态,请确保符合NCWidgetProviding协议。当小部件接收到widgetPerformUpdateWithCompletionHandler:调用时,请使用最新内容更新小部件视图,并调用完成处理程序,使用以下常量之一来描述更新的结果:

NCUpdateResultNewData - 新内容需要重新绘制视图

NCUpdateResultNoData - 小部件不需要更新

NCUpdateResultFailed - 更新过程中发生错误

参考 Today Widget


通知中心数据更新

通知中心

注意

widgetPerformUpdateWithCompletionHandler: 的安排和预期用途是为所有数据/模型更新逻辑提供便利的位置。如果实现了此方法,系统将在合适的时机调用它以便小部件能够更新其状态,包括通知中心可见时以及后台。必须实现此方法以便支持后台更新。预计小部件会异步执行工作并尽可能地脱离主线程进行。小部件应该在完成工作时调用传入的 block,同时传递适当的 NCUpdateResult。小部件不应该阻塞 viewWillAppear: 方法,并等待此操作的结果返回。相反,小部件应该在 viewWillAppear: 中加载缓存状态,以使其与上一个 viewWillDisappear: 所处的视图状态匹配,然后在新数据到达时平稳地过渡到新状态。

参考 iOS 8.1 Notification Center


小部件生命周期

Widget Life Cycle

参考:应用扩展生命周期


那么当小部件不可见时,我就无法更新内容了吗?苹果公司表示:“系统会在适当的时候调用小部件以更新其状态,无论是在通知中心可见还是在后台。”但是在我的调试中,我发现当NotificationCenter处于后台时,widgetPerformUpdate...从未被调用,至少对于我的小部件而言。 - DigitalBrain_DEV
请在此处查看通知中心部分:https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-8.0/ - DigitalBrain_DEV
@digitalPad:是的,系统会调用通知中心,并调用您的小部件。但您不能自己处理这些部分。这是系统管理和处理的。(就像后台获取一样) - Midhun MP
好的,谢谢。所以我不能确定方法是否被足够早地调用。有没有其他方法可以在后台更新小部件内容?我需要每小时下载新的源,这样用户每次看到小部件时都会得到更新。 - DigitalBrain_DEV
1
@digitalPad:据我所知,目前没有办法。你可以检查后台获取(但这是针对应用程序的,也由系统处理)。 - Midhun MP
它说“需要实现以启用后台更新”,这非常清楚。不管怎样,那该怎么做呢? - mskw

4

iOS8发布说明

注意: widgetPerformUpdateWithCompletionHandler:的计划和预期用途是作为所有数据/模型更新逻辑的方便之处。如果实现了该方法,系统将在合适的时候调用它来更新小部件状态,无论通知中心是否可见,以及在后台执行时。必须实现此方法才能启用后台更新。小部件应异步地并尽可能在非主线程上执行更新工作。当工作完成时,小部件应调用该参数块,并传递适当的NCUpdateResult。小部件不应该阻塞返回viewWillAppear:这个操作的结果。相反,小部件应该在viewWillAppear:中加载缓存状态,以便与上一个viewWillDisappear:的视图状态匹配,然后在新数据到达时平稳地过渡到新数据。

您需要实现以下两个方法:

  • viewDidAppear:
  • widgetPerformUpdateWithComplationHandler:

在widgetPerformUpdateWithComplationHandler:中刷新您的数据,然后使用NCUpdateResult调用完成块。

在viewDidAppear中刷新视图:启动图像(快照)将来自上一个viewDidDissappear:新内容将在下一个运行循环的末尾显示。

感谢DigitalBrain_Dev提供文件参考。


-1
在 func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) 方法中调用您的 API,并调用 completionHandler(NCUpdateResult.newData)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接