2014-05-07 18 views
7

使用iOS7,可能需要使用completionHandler进行远程通知。是否可以为UILocalNotifications做同样的事情?使用UILocalNotifications,使用完成处理程序和后台提取进行远程通知

基本上,我想要一个web服务以30秒的规则时间间隔发布我的一些数据,即使应用程序在后台。为此,我认为有3个选项,但没有任何获得帮助:

  1. 背景提取:这将在后台工作,但由于不是强制性的,iOS将始终调用此背景下,我不能用它在我所需的时间间隔取回。

  2. 远程通知:此功能完美。但是每隔30秒我都必须发布远程推送通知,这实际上并不实际。如果我可以在本地处理它也会很好。

  3. UILocalNotifications:这里没有完成处理程序。用户将需要打开该应用程序。所以这不起作用!

还有其他的选择吗?或者即使使用iOS7,仍然无法在本地进行后台操作?

请帮忙。谢谢!

+0

为什么你需要将信息发送到服务器,这样的时候,如果用户甚至没有看你的应用程序? – Rivera

+0

@Rivera它的东西,用户将开始录制,它应该继续,即使应用程序在后台。它仅在用户停止时停止。奇怪的要求,我知道!但这就是我需要建立的! – mayuur

+0

录制什么?也许你可以在本地录制? Apple会检查您的应用程序消耗多少,并调整其调用背景方法的频率,因此您最好不要通过将数据发送到服务器来实现“eco”。 – Rivera

回答

5

您已经涵盖了所有选项,正如您所看到的,这不受支持。出于好的理由,大多数情况下,在后台唤醒应用程序是一项代价高昂的操作(在iOS7中,应用程序完成其后台工作后会拍摄快照),每30秒执行一次操作会对电池寿命造成破坏。

鉴于您尚未提及需要发布的数据,在大多数情况下,我建议您重新设计您的应用以便与用户的电池友好。如果您需要位置报告,请考虑聆听重大位置更改,而不是每30秒记录一次。

滥用推送通知是可能的(请注意,无声远程通知受Apple限速限制),但请考虑您的用户拥有的体验。

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

2

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

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler 

NSURLSession要求NSURLConnection的不再是服务呼叫有效的API或也不支持后台任务。凭借其先进的iOS 7优势,NSURLSession显然是NSURLConnection的替代API。从苹果的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一般一样尊重设备资源&。希望这回答你的问题。

1

其实,所有看起来像你不能在背景的定期时间与web服务进行通信。

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

的iOS允许后台多活动,使用指定的UIBackgroundModes的一个应用程序,请参见“为表3-4背景模式应用“:

Here is a link to related Apple docs

如果您的应用程序没有定位直接BG模式之一,我阿尼尔·库马尔(以上职务)同意这样的背景下获取是这里最有用的东西。但是它并不完全符合你的需求。 [UIApplication setMinimumBackgroundFetchInterval:]它并不意味着任何严格的时间。它意味着最小间隔(或所需时间)。下面是详细信息:

performFetchWithCompletionHandler never gets fired

感谢

+1

关于远程通知,我错了。如果用户没有在任务管理器中使用刷卡专门杀死应用程序,则可以使用远程通知在后台唤醒应用程序,前提是推送有效负载以正确的时间间隔到达。但这是一个坏主意。 –

+0

@LeoNatan同意,从iOS 7.0开始,远程通知可以唤醒应用程序。感谢澄清。 –

相关问题