我有一个iOS今日小部件,它会进行昂贵的API调用(代价越高,我付的钱就越多)。如果我在我的小部件中实现widgetPerformUpdateWithCompletionHandler,则可以在后台多次更新小部件,而无需用户查看其通知中心。
在应用程序中,应用程序的选项字典中有一个键值对:didFinishLaunchingWithOptions,它告诉您应用程序是否正在启动背景,但是在我可以找到的小部件中没有类似的东西。还有调用在UIApplication中获取applicationState,这在widget中也不可用。
那么,在我的小部件中是否有任何可靠的方式可以知道系统正在后台更新我的小部件而用户没有查看他们的通知中心以避免不必要的API调用?当用户查看窗口小部件时,我对内容不完全是最新的很好,因为我可以在加载后很快更新它。
我一直在尝试找到一个hacky解决方案,就像在后台更新窗口小部件时,视图或窗口不同的东西,但还没有找到任何东西。我注意到偶尔会在后台初始化窗口小部件时窗口框架的高度为零,但似乎并非总是如此。
我也知道如果我没有实现widgetPerformUpdateWithCompletionHandler,那么我的小部件不会在后台更新,这是一个可能的解决方案,但我正在寻找一种方法,我可以吃蛋糕然后吃它太
如果有人有任何其他想法,我会全力以赴。感谢。
答案 0 :(得分:2)
如果您只是计划调试并了解它的调用频率,您可以在设备上使用一些日志记录(甚至可能会在每次调用widgetPerformUpdateWithCompletionHandler
时触发某种类型的分析事件,以便进行调解是否经常发生这种情况。)
减少请求数量的主动解决方案的一个示例是对请求进行时间控制,如果widgetPerformUpdateWithCompletionHandler
每隔 x 分钟/小时/等运行多次,则不会调用API,但只是调用completionBlock
而没有新数据。
对API调用有更严格限制的最后一个例子可能是在今天的扩展中完全避免它们(就像你说的那样)。这意味着API调用只会在启动实际应用程序时完成,并且响应仍然存在(您可以在应用程序和今天的扩展程序之间拥有一个共享容器 - 只是一个文件夹,甚至更复杂的东西,如用于Core Data的sqlite存储)并始终从共享容器中检索数据以更新今天的扩展UI。
答案 1 :(得分:1)
我提交了一份Apple开发者技术支持票。他们回应并告诉我,我不可能为此提交增强请求。我提交了rdar:// 27434852。
答案 2 :(得分:0)
widgetPerformUpdateWithCompletionHandler
实际上非常不可靠。如果您只是在viewDidLoad
的后台启动网络通话,则只有当您的今日小部件出现在屏幕上时才会调用它。