2016-05-14 83 views
0

我一直在使用交互式通知,它適用於當我的應用程序被掛起在後臺,但當我的應用程序被終止時導致問題。handleActionWithIdentifier當應用程序未啓動

我已經使用NSLog來確定應用程序的生命週期,當應用程序尚未啓動時觸發交互式通知。

以下的推移,在列出的順序,而不應用明顯啓動:

didfinishlaunching handleActionWithIdentifier viewDidLoad中 viewwilllayoutsubviews viewdidlayoutsubviews viewdidappear

則APP似乎終止,而無需調用 didenterbackground或willTerminate

它之所以會導致m問題e是因爲我在viewDidload中創建了在didenterbackground中失效的定時器。

因爲didenterbackground沒有被調用,所以當應用程序在觸發一個交互式通知後被啓動時,我結束了兩個定時器實例。

任何人都可以闡明爲什麼應用程序終止,但didenterbackground或willTerminate沒有被調用?

+0

因爲你的應用程序直接射入的背景。它不會從前景轉換到背景 – Paulw11

回答

0

你不應該認爲對didfinishlaunching的調用意味着你處於前臺。正如@ PaulW11在他的評論中所說的,對於當你的應用程序沒有運行時的本地通知,你會直接進入後臺,並且從不會看到前景到後臺的轉換,因爲你從來沒有處於前臺。

如果您被啓動到前臺,系統將調用applicationDidBecomeActive:。你應該把你的定時器的代碼放在那裏。

的文檔說本地通知通告得到在後臺調用:

當用戶點擊一個遠程或本地 通知在警報自定義操作,則系統會調用 應用:handleActionWithIdentifier: forRemoteNotification:completionHandler: 或 application:handleActionWithIdentifier:forLocalNotification:completionHandler: 方法在後臺運行,以便您的應用可以執行關聯的 操作。

您應該編寫您的application:handleActionWithIdentifier:forLocalNotification:completionHandler:方法來檢查它是從前臺還是從後臺調用。這樣

我使用(Objective-C的)代碼告訴我是否在前臺或後臺:

BOOL inBackground = [UIApplication sharedApplication].applicationState == UIApplicationStateBackground;