2012-02-07 121 views
2

我正在處理涉及推送通知的一個iPhone應用程序。正如我在許多文件和教程已經看到它提出了推送通知與註冊在當應用程序未運行時獲取推送通知iPhone

application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

類似如下:

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert| UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound]; 

    ... 
} 

現在的問題是,如果應用程序沒有運行(甚至在背景),當推送到達時,它不能處理推送消息,但是如果我再次使用來自通知區域的推送消息並再次將應用程序中餐,我可以收到我的消息。

我需要做些什麼才能使我的應用程序即使在第一次午餐時也能獲得推送消息?

+0

你怎麼去推送到設備您註冊之前,拿到了鑰匙和它發送到你的服務器有關係嗎? – mattjgalloway 2012-02-07 21:39:29

+0

如果應用程序在過去使用過,我的服務器將跟蹤設備令牌,所以即使它當時沒有損壞,我也可以發送一個推送。但現在問題出現在應用程序第一次啓動時。它正在嘗試註冊以通知不處理通知。我怎麼能解決這個問題? – shebelaw 2012-02-07 21:42:39

+0

掛在什麼?我想你已經弄糊塗了。見@ warrenm的答案。 – mattjgalloway 2012-02-07 21:53:36

回答

6

您可能會混淆註冊和接收通知的概念。在第一次調用registerForRemoteNotificationTypes:方法之前,應用程序無法接收推送通知,因爲此方法首先提供用於發送推送通知的推送令牌。

因此,您必須在兩種不同的情況下討論接收通知:初次啓動應用程序和執行程序期間。

爲了處理第一種類型的通知,您必須檢查發送到application:didFinishLaunchingWithOptions:options字典。以下代碼顯示瞭如何將啓動時收到的通知路由到在應用程序已經運行時推送通知到達時調用的委託方法。

將此放在您的application:didFinishLaunchingWithOptions:覆蓋:

NSDictionary *pushNotificationPayload = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 
if(pushNotificationPayload) { 
    [self application:application didReceiveRemoteNotification:pushNotificationPayload]; 
} 
+0

是的,這可能是正確的解決方案,我會測試它。謝謝Warrenm – shebelaw 2012-02-07 21:45:08

+0

是的,這是正確的解決方案,但是如果我想要alert('UIAlert'放置在'didReceiveRemoteNotification'方法內),用戶將點擊App圖標而不是推送通知將會出現! – 2013-05-02 09:42:46

+0

您可能有更好的運氣發佈此作爲一個新的問題,而不是作爲對超過一年的答案的評論。 – warrenm 2013-05-03 03:24:27

相關問題