2012-04-12 91 views
37

我讀上推送通知處理

Handling Local and Remote Notifications

蘋果的文檔,它看起來對我有衝突的聲明。有人能澄清這些混亂點嗎?現在讓我們嚴格說說遠程通知(與本地)。

文檔說,如果通知上的操作按鈕被按下,它會調用application:didFinishLaunchingWithOptions並傳入通知有效內容。後來它說如果應用程序在前臺運行,它會通過application:didReceiveRemoteNotification:來傳遞通知。這意味着當應用程序背景或未運行時,應用程序:didFinishLaunchingWithOptions被調用。否則,應用程序:didReceiveRemoteNotification:被調用。

後來,有一個iOS的紙條,上面寫着以下內容:

「iOS版注:在iOS中,您可以決定一個應用程序被啓動,是用戶的敲擊動作按鈕或通知是否被交付結果在應用程序的代理實現中:didReceiveRemoteNotification:或application:didReceiveLocalNotification:方法,獲取applicationState屬性的值並對其進行評估;如果值爲UIApplicationStateInactive,則用戶點擊操作按鈕;如果值是UIApplicationStateActive,則應用程序在收到通知時處於最前面。「

這意味着應用程序:didReceiveRemoteNotification:在應用程序已經預先着手並且用戶按下動作按鈕(或將幻燈片放在iOS 5中的動作滑塊)前景/啓動應用程序時調用。

我的困惑的根源可能在於文檔暗示通知有效內容與應用程序一起發送的第一部分:didFinishLaunchingWithOptions:方法或誤解了「正在運行」的應用程序是什麼(後臺應用程序被認爲是「運行「?)。應用程序的文檔:didReceiveRemoteNotification:聲明它被稱爲「正在運行」的應用程序。

因此,要總結,我能得到澄清:

1)是應用:didReceiveRemoteNotification:當應用程序被前景化或總是叫當用戶選擇的通知「行爲」?如果不是,我們如何理解iOS中有關確定應用程序狀態處於活動狀態還是非活動狀態的說明?

2)是一個後臺應用程序「運行」,至少在文檔聲稱應用程序意義上說:didReceiveRemoteNotification被稱爲運行應用程序?

3)完成後,是一個後臺應用UIApplicationStateInactive或Active?

+19

我可以得到一個複選標記嗎? – ch3rryc0ke 2012-07-19 22:45:40

回答

91

這裏的措辭令人困惑,特別是在背景詞的背後。

當真正沒有在內存(E,G,當你啓動它的啓動畫面顯示出來等)加載的應用程序,然後應用中:didFinishLaunchingWithOptions被調用時,你可以得到推送通知如下:

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 

if(remoteNotif) 
{ 
    //Handle remote notification 
} 

如果應用程序在內存中加載並且處於活動狀態(例如應用程序當前在設備上打開),則僅調用application:didReceiveRemoteNotification:

如果應用程序在內存中加載但未處於活動狀態且不處於背景狀態(例如,您啓動了應用程序,然後按下主頁按鈕並等待10秒鐘),然後單擊推送通知上的操作按鈕,只調用了didReceiveRemoteNotification。

如下您可以捕獲這種情況下:

-(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    if([app applicationState] == UIApplicationStateInactive) 
    { 
     //If the application state was inactive, this means the user pressed an action button 
     // from a notification. 

    //Handle notification 
    } 
} 
+2

在您解釋的第一個案例中調用了「didReceiveRemoteNotification」嗎?用你編寫的兩種方法實現我的代碼是否足夠?代碼不會運行兩次嗎?謝謝。 – 2014-06-27 20:06:16

+1

這在不正確的:如果你有通知中心可見或控制中心例如,應用程序被視爲無效。你有沒有關於如何確定「從背景變得活躍」的建議? – dvkch 2014-09-03 15:26:35

+0

也注意到相同的行爲與didReceiveRemoteNotification相關:(NSDictionary *)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0); – valvoline 2015-01-21 11:37:24

2

按的iOS 9.1的情況我已經在我的應用程序是不以任何方式在該時間後運行殺模式下測試推送通知,如果我的推送通知自來水比系統會先調用,

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ 

//your code execution will here. 

} 

而第二個方法調用將是,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

//Your initial code execution. 

} 

這個場景我已經在我的應用程序中測試過了。

+0

您是如何測試這種情況的,請解釋一下? – Nico 2016-11-21 08:17:09

+0

Nico,我打印登錄文檔目錄文件來檢查哪一個方法將在推送通知的kill模式中被調用。 – 2016-11-22 05:00:43