2015-07-20 126 views
0

我一直在构建一个流应用程序,并且我必须实现一个系统,必须在午夜开始并在早上结束。我的问题是我无法弄清楚如何实现它。iOS,ObjC:服务在后台运行

该系统必须在应用程序启动时保持警惕,并且即使应用程序进入后台时也必须继续运行。

同时,我试图实现一个计时器,它只运行一段时间,并在一段时间后死亡。我的应用程序不是VoiP或StandApp。官方我没有权利运行无限的服务。无论如何,我需要一个解决方案,将在上午12点调用方法,并开始文件下载。

//and create new timer with async call: 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    //run function methodRunAfterBackground 
    NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(isNightFrame) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 
}); 

然后我试图与UILocalnotifications玩,但它似乎必须有用户迭代。他必须点击通知。

我需要一些建议,要走哪条路以及如何才能把事情做好。先谢谢你。

回答

2

在没有越狱的设备上,没有办法实现你想要做的事情。
如果您的应用程序未使用Apple提供的任何背景模式,那么在应用程序被iOS暂停后,您将无法触发任何代码执行。
我想你使用的是“应用程序播放音频”的背景模式。即使启用此模式,如果您的应用程序没有真正播放音频,该应用程序也会被暂停。

TL; DR:没有办法到恢复暂停的应用程序没有用户的非越狱设备上的交互

编辑:其实,有可能通过使用Background Fetch执行一些代码,但我敢肯定的是,iOS将永远不会让你为已暂停的应用程序开始从background fetch音频会话。

编辑2:根据this article,您不能选择触发Background Fetch。 iOS决定为您的应用程序触发它。

应用程序可以执行后台提取的频率是由系统决定的 。这取决于多种因素,如:

无论网络连接可用在特定时间
设备是否是苏醒
多少数据和时间您的应用程序 已经在以前尝试执行后台获取
换句话说,您的应用程序完全由系统 的摆布来安排您的后台提取。
此外,每次您的 应用程序使用后台提取,它最多只有30秒到 完成的过程。

iOS可以决定在您的应用收到推送/本地通知后触发Background Fetch。但它绝对不可靠(就像一样)。

+0

谢谢你的回应。实际上,我需要启动的服务是文件下载。当我的应用程序在后台时,如何在LocalNotifcation被触发后提交后台提取?我需要实现哪个AppDelegate方法? – NCFUSN

+0

我更新了我对此的回答。 –

+1

对于本地通知,当通知触发时,没有任何方法可以调用。应用程序永远不会知道何时触发本地通知但是一旦你点击通知,它就可以访问应用程序。 – Samir