2012-08-23 28 views
34

與此類似問題得到通知的數據:How do I access remote push notification data on applicationDidBecomeActive?的iOS推送通知 - 如何當你點擊應用程序圖標,而不是通知

但不同的是,你怎麼能當你在applicationDidBecomeActive訪問通知數據和如果您點擊了應用程序圖標而不是推送通知。

的流程是:如果你點擊push notification然後didReceiveRemoteNotification將被觸發,但如果你點擊原來的應用程序圖標,只有applicationDidBecomeActive將被觸發,didReceiveRemoteNotification不會被調用。

我正在尋找後面的情況,所以我如何訪問推送通知數據。

(兩種情況下,假定應用程序是在後臺,而不是殺死呢。)

+2

這是不可能的。如果通知數據是在響應通知時啓動的,而不是在應用程序圖標上點擊時纔會傳遞給應用程序。 –

+1

你通過推送通知傳遞什麼信息?對我來說,這聽起來像是你設計上的缺陷,如果你不能先打開推送通知,就無法打開你的應用程序。 – xci

回答

35

您不能從主屏幕啓動應用程序獲取遠程推送有效載荷。

如果推送數據對應用程序使用很重要,請在啓動應用程序後從服務器加載它。

+2

要繼續這個軌跡,每當啓動應用程序時,您都可以向您的服務器發送一個小型有效內容,然後讓您的服務器監聽該有效內容並立即推送數據。這將是我能想到的最接近的解決方法來實現您的目標。 –

-6

你應該得到的launchWithOptions方法通知你的appDelegate是這樣的:

NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; 

    if(remoteNotif != nil){ 
     //Handle your notification 
    } 
+1

該應用程序目前處於後臺,我從主屏幕點擊應用程序而不是通知。 – Howard

6

@fannheyward答案是絕對正確的。點擊應用程序圖標啓動應用程序時無法獲得有效載荷。

我有一個想法,如果你知道某些通知是在通過點擊應用程序圖標啓動應用程序時未決。有了這些知識,您的應用就可以從您的服務器獲取有效載荷

您可以在每個此類通知中設置「徽章」,並在applicationDidBecomeActive上檢查[application applicationIconBadgeNumber]> 0以瞭解某些通知處於活動狀態。從服務器獲取有效載荷後,你可以將其設置爲0,像下面

[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]; 
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; 

請注意:這意味着收到通知時,您的應用程序將顯示在它的徽章。我不確定用戶從設置中禁用徽章時的行爲。

+0

我正在使用相同的方法。請注意,用戶*可能*啓用了通知提醒,但*徽章被禁用*用於您的應用。實際上,雖然......誰做的? ;) – Timo

+0

關於>>我不確定當用戶從設置中禁用徽章時的行爲 - 如果徽章沒有顯示在應用程序圖標上,應用程序仍然可以獲得正確的計數事件 –

3

如果您的應用程序目標已超過iOS7,則只有在應用程序在背景中保持活動狀態時纔可以執行此操作。

在Xcode的能力設置中,您應該啓用背景模式>遠程通知,然後寫下面的代碼。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    // save userInfo in NSUserDefaults 
    completionHandler(UIBackgroundFetchResultNoData); 
} 

如果你想測試,這將有助於使用https://github.com/acoomans/SimulatorRemoteNotifications

  • 從服務器端,一定要設置內容提供財產以1

爲了這個工作,我還必須檢查背景獲取框。

+0

我在iOS8上使用iphone 6時嘗試這樣做, content-available = 1,後臺模式遠程通知,app在後臺。收到通知時調用didReceieveRemoteNotification。它在應用程序打開時不會被調用。這並沒有回答這個問題。 – wyu

相關問題