2015-04-28 50 views
12

如果我重寫爲什麼didReceiveRemoteNotification未被調用,但didReceiveRemoteNotification:fetchCompletionHandler在我的應用程序處於前臺時調用?

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    println("hey) 
} 

我已經成功地調用在前臺應用程序時,我發送推送通知的方法。

如果我重寫

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 
    println("hey") 
} 

發送與前臺應用程序的通知時,我沒有得到任何方法調用。爲什麼第一個工作,但第二個不是當應用程序在前臺?

請注意,我一次只實現其中的一個。不是在同一時間。

回答

15

除非您需要支持ios < 7(當它被引入時),否則您應該使用回調版本。正如你正在使用Swift,我認爲情況並非如此。

老方法回到IOS3並已被棄用,但在所有的名字:

落實application:didReceiveRemoteNotification:fetchCompletionHandler:方法,而不是這一個只要有可能。如果您的委託實現了這兩種方法,則應用程序對象將調用application:didReceiveRemoteNotification:fetchCompletionHandler:方法。

根據應用程序是活的(前景還是背景)還是從冷啓動啓動,舊版本也會給出不同的結果。在後一種情況下,它不會叫,你將需要攔截的didFinishLaunchingWithOptionslaunchOptions字典來獲得在infoDict:

如果在遠程通知到達時,應用程序沒有運行,該方法啓動應用程序並在啓動選項字典中提供適當的信息。該應用程序不調用此方法來處理該遠程通知。

使用回調版本。它適用於所有情況。 您不必使用完成處理程序/塊 ,在這種情況下,效果是相同的(很好,與新方法更一致)。

更新

對不起,蘋果說你必須調用完成塊「儘快」 - 你有30秒這樣做之前,OS上你放棄。這可能是您警告的來源。

一旦完成處理通知,您必須在處理程序參數中調用該塊,否則應用程序將終止。您的應用程序有多達30秒的掛鐘時間來處理通知並調用指定的完成處理程序塊。在實踐中,您應該在處理通知後立即調用處理程序塊。

所以調用完成塊:

 completionHandler(UIBackgroundFetchResult.NoData) 

我一直在使用這種方法沒有調用該完成的塊並沒有遇到任何問題,但我會添加一個,現在只要是安全的。蘋果建議,如果你不這樣做,你的應用程序不會被預先考慮,但我在實踐中沒有看到。

+0

不使用完成處理程序時會收到警告。我應該忽略它嗎? –

+0

@AdamJohns - 你會得到什麼警告?什麼版本的XCode/Swift? – foundry

0

您是否註冊了至少一個UIUserNotificationTypeUIApplication:registerUserNotificationSettings:

如果您沒有註冊徽章,聲音或提醒,那麼您只能接收靜默通知,這些通知僅通過FetchCompletionHandler提供。

相關問題