2016-11-06 145 views
5

我正在爲我的學校創建一個應用程序,如果網站上有新標記,應每n分鐘檢查一次。 要在用戶首次登錄時執行此操作,實際標記的編號將保存在「UserDefaults」中。當應用程序被終止時,在n分鐘後,標記的數量被重新計算並與前一個進行比較,並在數字被改變時發送通知。當應用程序終止時執行後臺任務

我想知道是否有辦法執行此任務。我試着在-applicationWillTerminate中創建一個計時器,但它只被觸發一次。 這是我試過的:

func applicationWillTerminate(_ application: UIApplication) { 
    DispatchQueue.main.async { 
     self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(AppDelegate.findMark), userInfo: nil, repeats: true) 
     self.timer.fire() 
    } 
} 

選擇器findMark是任務。

提前致謝!

+0

當應用程序終止時無法執行此操作。請檢查我的答案。隨意問任何疑問:) – KrishnaCA

+0

你打算在後臺運行的應用程序的無限時間或只是當應用程序被終止? –

+0

我的理解是,你想在後臺無限期地運行它,並且每當計數器得到更新的標記數,你想發送通知,那你打算怎麼做? –

回答

9

你有兩個選擇

  1. 後臺應用刷新
  2. 無聲推送通知

最簡單的一種是後臺應用刷新。因爲稍後需要服務器來發送通知。您可以檢查以下API的使用情況。基本上你設置背景獲取功能在您的應用程序的功能/背景模式。然後,iOS不時會喚醒您的應用並致電application(_:performFetchWithCompletionHandler:)代表。您將有大約30-45秒的時間來調用您的函數和調用完成處理程序。如果你沒有按時完成,iOS會殺死你的應用程序。如果你不遵守這些規則,iOS會給你更少的機會醒來。有關背景模式的更多詳細用法,您可以檢查以下tutorial

+0

我讀過應用程序(_:performFetchWithCompletionHandler :)不會每n分鐘執行一次任務。是不是? –

+0

是的。 iOS會安排此調用,並且您無法知道它何時會被調用。然而,越多的應用程序使用,更多的iOS將調用這個處理程序。沒有推送通知,在n分鐘內沒有可靠的方式來喚醒應用程序。 – Meanteacher

+0

根據這個問題,這個答案不應該被接受。 – RamGrg

3

應用程序終止後,無法執行類似於問題中所述的任務。如文檔中描述:

應用程序終止

的應用必須終止準備在任何時候發生,不應該等待保存用戶數據或執行其他關鍵任務。系統啓動的終止是應用程序生命週期的正常組成部分。系統通常會終止應用程序,以便它可以回收內存併爲用戶啓動的其他應用程序騰出空間,但系統也可能會終止錯誤操作或未及時響應事件的應用程序。

掛起的應用程序在終止時不會收到通知;系統殺死進程並回收相應的內存。如果應用程序當前正在後臺運行並且未掛起,系統會在終止之前調用其應用程序委託的applicationWillTerminate:。設備重新引導時,系統不會調用此方法。

除了系統終止您的應用程序,用戶可以使用多任務UI顯式終止您的應用程序。用戶發起的終止與終止暫停的應用具有相同的效果。應用程序的進程被終止並且沒有通知被髮送到應用程序。

鏈接:https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

編輯:

應用程序被終止後,您不能執行任何任務。你可以做的是從服務器端完成計算,併發送Push Notification到設備。

+0

謝謝,我該怎麼辦?因爲有很多離線遊戲發送通知,例如,即使應用程序與多任務管理器手動關閉,此建築也會終止.. –

+0

這是PushNotification或LocalNotification。如果這是需要的,那麼我會在答案中加上這一點。等等.. – KrishnaCA

+0

是的,這就是我指的..但是當應用程序關閉時,發送localNotification的任務只會被調用一次 –

相關問題