如何判断iOS Today小部件是否正在后台更新?

如何判断iOS Today小部件是否正在后台更新?,ios,ios9,today-extension,Ios,Ios9,Today Extension,我有一个iOS Today小部件,它可以进行昂贵的API调用(因为调用的次数越多,我支付的费用就越高)。如果我在我的小部件中实现widgetPerformUpdateWithCompletionHandler,那么小部件可以在后台一天更新几次,而用户永远不会查看他们的通知中心 在应用程序中,在应用程序的选项字典中有一个键值对:didFinishLaunchingWithOptions,它告诉你应用程序是否正在启动后台,但我在小部件中找不到类似的东西。还有一个在UIApplication中获取ap

我有一个iOS Today小部件,它可以进行昂贵的API调用(因为调用的次数越多,我支付的费用就越高)。如果我在我的小部件中实现widgetPerformUpdateWithCompletionHandler,那么小部件可以在后台一天更新几次,而用户永远不会查看他们的通知中心

在应用程序中,在应用程序的选项字典中有一个键值对:didFinishLaunchingWithOptions,它告诉你应用程序是否正在启动后台,但我在小部件中找不到类似的东西。还有一个在UIApplication中获取applicationState的调用,它在小部件中也不可用

那么,在我的widget中是否有可靠的方法可以知道系统正在后台更新我的widget,并且用户没有查看他们的通知中心来避免不必要的API调用?当用户查看小部件时,我对内容没有完全更新感到满意,因为我可以在加载后很快更新它

我一直在试图找到一个黑客解决方案,比如当小部件在后台更新时,视图或窗口会有所不同,但还没有找到任何东西。我注意到,当小部件在后台初始化时,窗口框架的高度有时为零,但情况似乎并非总是如此

我还意识到,如果我不使用CompletionHandler实现WidgetPerformUpdate,那么我的小部件就不会在后台更新,这是一个可能的解决方案,但我正在寻找一种既能吃蛋糕又能吃蛋糕的方法


如果有人有其他想法,我洗耳恭听。谢谢。

如果您只是计划调试并了解调用频率,您可以在设备上使用一些日志记录(甚至可能在每次调用
widgetPerformUpdateWithCompletionHandler
时触发某种分析事件通知,以便调解这种情况是否过于频繁)

减少请求数量的主动解决方案的一个示例是对请求进行时间选通,如果
widgetPerformUpdateWithCompletionHandler
每x分钟/小时运行一次以上/etc,则不调用API,只需调用
completionBlock
,而不使用新数据


对API调用有更严格限制的最后一个例子可能是在今天的扩展中完全避免它们(正如您所说的)。这意味着API调用只能在实际应用程序启动时进行,并且响应保持不变(应用程序和今天的扩展程序之间可以有一个共享容器-只是一个文件夹,甚至是一些更复杂的东西,比如核心数据的sqlite存储)并始终从共享容器中检索数据以更新当前的扩展UI。

WidgetPerformUpdate WithCompletionHandler
在iOS 9中实际上非常不可靠。如果您只是从
viewdiload
在后台启动网络呼叫,则只有当您的“今日”小部件出现在屏幕上时才会调用它。

我就此提交了一份苹果开发人员技术支持通知单。他们回答说,这是不可能的,我需要为此提交增强请求。我归档rdar://27434852.

谢谢你的建议。不幸的是,我想确保在用户打开通知中心并看到小部件时立即调用API。因此,时间选通和仅在应用程序中进行更新并不是足够的解决办法。如果只在正在显示的小部件的
viewDidLoad
被调用时才进行调用呢?一个昂贵的呼叫,也可能处于慢速网络中,可能意味着请求和响应之间会有轻微的延迟,但这将确保如果扩展是从用户的操作而不是后台触发器提取的,则会发出请求。viewDidLoad,ViewWillDisplay,甚至当它在后台更新时,也会调用et al,可能是因为它正在对最终视图进行快照。在这两种情况下也会调用widgetPerformUpdateWithCompletionHandler。因此,我无法判断小部件是否在后台运行。当小部件不在屏幕上时,不会调用视图生命周期调用。不确定你所说的“即使在后台更新”是什么意思,当你的小部件不在屏幕上时,它们确实会被调用。我在每次通话中都会输入日志消息,即使手机被锁定,屏幕也会显示出来。当WidgetPerformUpdate WithCompletionHandler在后台从系统中启动时,屏幕会关闭。这并不可靠,因为你永远不知道它在后台何时启动,但在我的测试中它似乎经常运行,有时一小时不止一次。当它在后台运行时,viewDidLoad、ViewWillDisplay、ViewDidDisplay都会运行。不幸的是,在viewDidLoad中执行某些操作将在小部件处于后台时运行。它不可靠,因为即使在前台,它也不总是被调用。我测试这个已经有一段时间了,但我认为如果不实现
widgetPerformUpdateWithCompletionHandler
我同意如果不实现widgetPerformUpdateWithCompletionHandler,小部件在后台永远不会被唤醒。这是苹果公司为数不多的关于这次电话的记录。不实现此调用的缺点是,当NotificationCenter未挂起在内存中并且需要从头开始初始化时,当NotificationCenter打开时,小部件可能需要更长的时间才能显示。使用CompletionHandler实现WidgetPerformUpdate通常会导致小部件经常挂在内存中,从而使其更快地显示。所以我希望保留它。啊,我是从你的评论
中获取的,我很高兴当用户看的时候,内容不是完全最新的