2013-10-15 142 views
8

我正在使用parse.com作爲我正在構建的測試應用程序的APNs提供程序。我已經確認推送通知正在工作,因爲我已經能夠在應用處於前臺時成功接收提醒。此外,我有我的plist中指定的UIBackgroundModes密鑰的remote-notification值。後臺中的Apple推送通知

在我的應用程序中,我希望在收到推送通知時將用戶的當前位置數據發回給我的特定於應用程序的parse.com數據庫。我實際上並不關心通知有效載荷本身,因爲通知只是獲取一小段信息的一種手段。該應用程序不斷在後臺收集數據並將其存儲在持久的NSDictionary中。

我已經把位置發送代碼放在application:didReceiveRemoteNotification:方法中。如果我的應用在我收到通知時處於前臺,該方法會被調用。如果我的應用程序在後臺,該方法不會被調用。

  • 我做錯了什麼?
  • 它甚至有可能當應用程序在後臺運行,並且用戶還沒有與通知互動中application:didReceiveRemoteNotification:執行API請求**

編輯:的問題依然存在,甚至當我使用application:didReceiveRemoteNotification:fetchCompletionHandler:

注意:我的NSDictionary充滿了位置數據不是空的。另外,我並不試圖在後臺執行任何UI操作 - 只是嘗試執行API請求。

回答

15

檢查以下內容:

  • 通知有效載荷包括 「內容提供」
{"alert":"", 
"badge":"0", 
"content-available":"1", 
"sound":""} 
+0

工作!我在AppDelegate中打開了'content-available'標誌,但沒有在我的JSON APN中推送該標誌。謝謝,亞歷克斯!這解決了這個問題。 – ArtSabintsev

+0

哈,奇怪。它只有一次工作。將調查並回復給你 – ArtSabintsev

+0

沒關係,讓它工作!這只是從解析中接收數據的延遲。 – ArtSabintsev

0

documentation for UIApplicationDelegate -application:didReceiveRemoteNotification是這種方法相當清楚:

如果在推送通知到達時,應用程序沒有運行,該方法 啓動應用程序,並提供了 啓動選項字典中的相應信息。該應用程序不會調用此方法來處理推送通知的 。相反,您的應用程序的實現:willFinishLaunchingWithOptions:或 應用程序:didFinishLaunchingWithOptions:方法需要獲取 推送通知有效負載數據並進行相應的響應。

您需要在兩種方法中處理通知,以便能夠在應用程序處於後臺和前臺時作出響應。

+0

我想我明白'不running'爲完全關閉,不'inactive'或'background'模式。我會暫時嘗試一下,如果能夠正常工作,請將您的答案標記爲正確。 – ArtSabintsev

+0

它仍然無法正常工作。我現在試圖從'application:didFinishLaunchingWithOptions:'和'application:didReceiveRemoteNotification:'發送位置數據。如果應用程序位於後臺(例如,我按下了主頁按鈕),則不會發送任何數據,除非我與通知進行交互。如果我通過單擊它來與通知進行交互,則會輸入'application:didReceiveRemoteNotification:'方法。我究竟做錯了什麼?我從根本上誤解了背景通知應該如何工作? – ArtSabintsev

+0

我認爲我的應用程序實際上處於「掛起」狀態,而不是「背景」狀態。我認爲這可能是造成這個問題的原因。 – ArtSabintsev

0

,你可以嘗試使用,而不是這個

application:didReceiveRemoteNotification 

方法,因爲您需要在後臺模式下獲取您的推送,因此,當應用程序處於後臺模式時,這將起作用。但是,您可能需要在應用處於前臺時添加自定義通知或UIAlertView以顯示您的消息。希望它有幫助,而且還不算太晚。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 

    NSLog(@"Remote Notification Received: %@", userInfo); 

    UILocalNotification *notification = [[UILocalNotification alloc] init]; 
    notification.alertBody = @"message to be displayed"; 
    notification.applicationIconBadgeNumber = 1; 


    [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 
    completionHandler(UIBackgroundFetchResultNewData); 

} 
0

亞歷克斯·L的答案几乎工作我。

只需確保價值content-available爲1(數字),而不是一個字符串 「1」:

{ 
    "alert":"", 
    "content-available":1, 
    "sound":"" 
} 

badge參數是可選。

(使用解析服務器進行的APN)