使用 UILocalNotifications、带有完成处理程序的远程通知和后台获取
Posted
技术标签:
【中文标题】使用 UILocalNotifications、带有完成处理程序的远程通知和后台获取【英文标题】:Working with UILocalNotifications, Remote Notifications with completion handler and Background Fetch 【发布时间】:2014-05-07 03:32:38 【问题描述】:在 ios7 中,可以使用completionHandler
进行远程通知。是否可以对 UILocalNotifications 做同样的事情?
基本上,我希望网络服务以 30 秒的固定时间间隔发布我的一些数据,即使应用程序处于后台也是如此。为此,我考虑了 3 个选项,但没有得到任何帮助:
Background Fetch :这将在后台工作,但我不能使用它,因为 iOS 并非必须始终以我想要的时间间隔调用此后台 fetch。
远程通知:这非常有效。但是每 30 秒我必须发布一个远程推送通知,这根本不实用。如果能在本地处理就好了。
UILocalNotifications:没有完成处理程序。用户必须打开应用程序。所以这不是很好!
还有其他选择吗?或者即使使用iOS7,仍然无法在后台进行本地操作?
请帮忙。谢谢!
【问题讨论】:
如果用户甚至没有查看您的应用程序,为什么您需要如此频繁地向服务器发送信息? @Rivera 这是用户将开始录制的内容,即使应用程序在后台,它也应该继续。只有当用户停止它时它才会停止。奇怪的要求,我知道!但这就是我需要构建的! 录制什么?也许你可以在本地录制? Apple 会检查你的 App 消耗了多少,并调整它调用你的后台方法的频率,所以你最好不要将数据发送到服务器,以保持“生态”。 【参考方案1】:您涵盖了所有选项,如您所见,这不受支持。出于充分的理由,大多数情况下,因为在后台唤醒应用程序是一项昂贵的操作(在 iOS7 中,在应用程序完成后台工作后拍摄快照),每 30 秒执行一次将对电池寿命造成毁灭性影响。
由于您没有提及需要发布哪些数据,因此在大多数情况下,我建议您重新设计您的应用,以便对用户的电池友好。如果您需要位置报告,请考虑收听重大的位置变化,而不是每 30 秒记录一次。
可能会滥用推送通知(请注意,静默远程通知受 Apple 的速率限制),但请考虑您的用户将获得的体验。
如果您认为该功能应该存在但缺少,您应该向 Apple 提出增强请求并在此处发布雷达编号,以便人们可以复制它。
【讨论】:
【参考方案2】:后台获取是您问题的直接答案。每当 iOS 可以定期执行任务时,后台 fetch 都会启动您的 fetch 处理程序。您需要做的就是在
中发起您的 NSURLSession 请求- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
NSURLConnection 不再是服务调用的有效 API,也不支持后台任务。 NSURLSession 显然是 NSURLConnection 的替代 API,具有 iOS 7 的高级优势。在下面添加来自 Apple 的 iOS 文档的文档
NSURLSession is a replacement API for NSURLConnection. It provides
options that affect the policy of, and various aspects of the
mechanism by which NSURLRequest objects are retrieved from the
network.
后台获取间隔可以设置来定义后台获取的重复频率,但它也考虑了操作系统资源和挂起操作的因素
- (void)setMinimumBackgroundFetchInterval:(NSTimeInterval)minimumBackgroundFetchInterval;
iOS 7 显然提供了一种更新应用程序内容的更好方法,但它像 iOS 通常那样尊重设备资源和用户优先级。希望这能回答您的问题。
【讨论】:
【参考方案3】:实际上,看起来您无法从后台定期与 webservice 进行通信。
UILocalNotifications 或 Remote Notifications 需要用户的操作来唤醒应用程序(如果它是后台的)。 已编辑:从 iOS 7.0 开始,远程通知可以唤醒应用,但这不是一个灵活的解决方案
iOS 允许使用指定 UIBackgroundModes 之一的应用程序在后台进行更多活动,请参阅“表 3-4 应用程序的后台模式”:
Here is a link to related Apple docs
如果您的应用程序没有直接定位为 bg 模式之一,我同意 Anil Kumar(上面的帖子)的观点,即后台获取是这里最有用的东西。但是,它并不能完全满足您的需求。 [UIApplication setMinimumBackgroundFetchInterval:] 这并不意味着任何严格的时间。它仅表示最小间隔(或所需时间)。这里有更多信息:
performFetchWithCompletionHandler never gets fired
谢谢
【讨论】:
关于远程通知,我不正确。如果用户没有在任务管理器中使用滑动特别杀死应用程序,则可以使用远程通知在后台唤醒应用程序,前提是推送有效负载以正确的时间间隔到达。但这是个坏主意。 @LeoNatan 同意,从 iOS 7.0 开始远程通知可以唤醒应用。感谢您的澄清。以上是关于使用 UILocalNotifications、带有完成处理程序的远程通知和后台获取的主要内容,如果未能解决你的问题,请参考以下文章
关闭应用程序后禁用 UILocalNotifications
如何为每周和每年的每日设置 UILocalNotifications
静音 UILocalNotifications 发送一段时间