我有一个 iOS Today 小部件,它会进行昂贵的 API 调用(因为调用的次数越多,我付的钱就越多)。如果我在我的小部件中实现 widgetPerformUpdateWithCompletionHandler,那么该小部件可以在一天中在后台更新几次,而用户无需查看他们的通知中心。
在应用程序中,应用程序的选项字典中有一个键值对:didFinishLaunchingWithOptions 告诉您应用程序是否正在启动后台,但在小部件中我找不到任何类似的东西.还有在 UIApplication 中获取 applicationState 的调用,这在小部件中也是不可用的。
那么,在我的小部件中是否有任何可靠方法可以知道系统正在后台更新我的小部件并且用户没有查看他们的通知中心来避免不必要的 API 调用?当用户确实查看小部件时,我对内容没有完全更新感到满意,因为我可以在它加载后很快更新它。
我一直在尝试寻找一个 hacky 解决方案,比如在后台更新小部件时, View 或窗口会有所不同,但还没有找到任何东西。我注意到偶尔在后台初始化小部件时,窗口框架的高度为零,但似乎并非总是如此。
我也知道,如果我不实现 widgetPerformUpdateWithCompletionHandler,那么我的小部件不会在后台更新,这是一个可能的解决方案,但我正在寻找一种可以吃蛋糕的方法也是。
如果有人有任何其他想法,我会全力以赴。谢谢。
Best Answer-推荐答案 strong>
如果您只是计划调试并了解它被调用的频率,您可以在设备上使用一些日志记录(甚至可能在每次调用 widgetPerformUpdateWithCompletionHandler 时触发某种分析事件通知,在为了调解这种情况是否经常发生)。
减少请求数量的主动解决方案的一个示例是对请求进行计时,如果 widgetPerformUpdateWithCompletionHandler 每 x 分钟/小时/等运行一次以上,您不会调用 API,而只是调用 completionBlock 而没有新数据。
对 API 调用进行更严格限制的最后一个示例可能是在 Today's 扩展中完全避免它们(就像你说的那样)。这意味着 API 调用只会在实际应用程序启动时完成,并且响应持续存在(您可以在应用程序和 Today 的扩展程序之间拥有一个共享容器 - 只是一个文件夹,甚至更复杂的东西,比如 Core Data 的 sqlite 存储) 并始终从共享容器中检索数据以更新 Today's 扩展 UI。
关于ios - 如何判断 iOS Today Widget 是否在后台更新?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/38383594/
|