2015-07-20 187 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