2015-10-06 90 views
7

我週期性地顯示我的本地通知。檢測用戶點擊本地通知

UILocalNotification *notification = [[UILocalNotification alloc]init]; 
[notification setAlertBody:@"Test test"]; 
[notification setUserInfo:@{@"test": @"test"}]; 
[[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 

我需要檢測回那個通知,我打算寫在這裏。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 

無論用戶點擊通知還是自動在前臺調用,它總是調用該函數。

所以,我分開使用這個。

if (application.applicationState == UIApplicationStateActive) 

當我顯示通知中心時,它變成了InActive。但是,它仍然會調用didReceiveLocalNotification。我無法區分用戶是否點擊通知中心的通知或由於我的定期發佈通知。

我如何才能真正知道我在didReceiveLocalNotification中點擊了通知(從InActive State或Background State)?

+0

你究竟想要什麼? –

回答

7

假設我正確理解你的問題,我偶然發現了同樣的障礙,找不到超級乾淨的解決方案。

所以情況如下方法

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 

被調用,applicationState等於UIApplicationStateInactive發生在兩種情況下:

  1. 應用程序是在前臺和通知剛剛被解僱
  2. 通知已在一段時間前被解僱,通知中心被撤消,用戶點擊通知

一來區分這兩種情況的方法是檢查通知的fireDate:

notification.fireDate.timeIntervalSinceNow < 0.5 

如果這種表達是真實的,它很可能是第一種情況下發生的。如果該表達式是錯誤的,則很有可能發生第二種情況。

該解決方案取決於傳送通知的系統沒有延遲,和/或用戶速度不足以在通知發射後500ms內在通知中心點擊通知。我不確定發射延遲的可能性有多大。我想如果設備處於某種處理負載的情況下是可能的。

我希望有一個更清潔的解決方案,希望有人會分享它。

5

首先,從Apple Documentation閱讀:

用戶在使用iOS 8通知水龍頭自定義操作按鈕。在這種情況下,iOS調用 application:handleActionWithIdentifier:forRemoteNotification:completionHandler:application:handleActionWithIdentifier:forLocalNotification:completionHandler:。 在這兩種方法中,您都可以獲得操作的標識符,以便您可以確定用戶點擊哪個按鈕。您還可以獲得遠程 或本地通知對象,以便您可以檢索任何需要處理該操作的信息 。

用戶點擊提醒中的默認按鈕或點擊(或點擊) 應用程序圖標。如果輕擊默認操作按鈕(在運行iOS的設備上),系統啓動應用程序,應用程序調用其代理的 application:didFinishLaunchingWithOptions:方法,傳入 通知負載(用於遠程通知)或 本地通知對象(爲本地通知)。儘管 application:didFinishLaunchingWithOptions:不是 處理通知的最佳位置,但在此時獲取有效負載將使您 有機會在調用處理程序方法 之前開始更新過程。

,這是你如何區分是否didReceiveLocalNotification:從有效或無效狀態稱爲:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    UIApplicationState appState = UIApplicationStateActive; 
    if ([application respondsToSelector:@selector(applicationState)]) 
     appState = application.applicationState; 

    if (appState == UIApplicationStateActive) 
    { 
    } 
    else 
    { 
    } 
} 
-3

使用KVO鍵 - 值觀察瞭解,做一些當按鈕被竊聽。

+0

這不是KVO的用途。 – kalafun