使用UILocalNotifications,具有完成处理程序和后台提取的远程通知

时间:2014-05-07 03:32:39

标签: ios iphone objective-c ios7 uilocalnotification

使用iOS7,可以使用completionHandler进行远程通知。是否有可能对UILocalNotifications做同样的事情?

基本上,我希望web服务以30秒的固定时间间隔发布我的一些数据,即使应用程序在后台也是如此。为此我考虑了3个选项,但没有得到任何帮助:

  1. 后台提取:这将在后台运行,但我无法使用它,因为iOS不会强制要求我按照所需的时间间隔调用此后台提取。

  2. 远程通知:这非常有效。但是每30秒我就要发一个远程PUSH通知,这根本不可行。如果我能在当地处理它也会很棒。

  3. UILocalNotifications:此处没有完成处理程序。用户必须打开该应用程序。所以这也不行!

  4. 还有其他选择吗?或者即使使用iOS7,它仍然无法在后台本地执行某些操作?

    请帮忙。谢谢!

3 个答案:

答案 0 :(得分:5)

您已涵盖所有选项,如您所见,此功能不受支持。出于好的理由,主要是因为在后台唤醒应用程序是一项代价高昂的操作(在iOS7中,应用程序完成后台工作后拍摄快照),每30秒执行一次会对电池寿命造成破坏。

看到你还没有提到你需要发布什么数据,在大多数情况下,我建议你重新设计你的应用程序,以便对用户友好。电池。如果您需要位置报告,请考虑收听重要的位置更改,而不是每30秒记录一次。

可以滥用推送通知(请注意,静音远程通知受Apple限制),但要考虑用户的体验。

如果您觉得此功能应该存在且缺失,您应该向Apple打开增强请求并在此处发布雷达编号,以便人们可以复制它。

答案 1 :(得分:2)

后台提取是您问题的直接答案。只要iOS可以定期执行任务,后台提取就会启动您的提取处理程序。您需要做的就是在

中启动您的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通常的用户优先级。希望这能回答你的问题。

答案 2 :(得分:1)

实际上,所有人看起来都无法从后台定期与webservice通信。

UILocalNotifications或远程通知需要用户操作才能唤醒应用程序(如果它已落后)。 已编辑:从iOS 7.0开始,远程通知可以唤醒应用,但这不是一个灵活的解决方案

iOS允许使用指定UIBackgroundModes的应用程序在后台进行更多活动,请参阅“表3-4应用程序的背景模式”:

Here is a link to related Apple docs

如果您的应用程序没有直接定位于某个bg模式,我同意Anil Kumar(上文),背景提取在这里是最有用的。但它并不能完全满足您的需求。 [UIApplication setMinimumBackgroundFetchInterval:]它并不意味着任何严格的时间。它仅表示最小间隔(或所需时间)。以下是更多信息:

performFetchWithCompletionHandler never gets fired

由于