簡體   English   中英

檢測用戶點擊本地通知

[英]Detect user tap on local notification

我會定期顯示我的本地通知。

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)?

假設我正確地理解了你的問題,我偶然發現了同樣的障礙,無法找到一個超級干凈的解決方案。

那么以下方法的情況

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

在兩種情況下調用並且applicationState等於UIApplicationStateInactive

  1. 應用程序位於前台,通知剛剛被觸發
  2. 通知已經被解雇,通知中心被拉下來,用戶點擊了通知

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

notification.fireDate.timeIntervalSinceNow < 0.5

如果這個表達式為真,那很可能是第一個案例發生了。 如果表達式為false,則第二種情況很可能發生。

此解決方案取決於系統無延遲地發送通知和/或用戶不夠快,以便在通知觸發后500ms內點擊通知中心的通知。 我不確定發射延遲的可能性有多大。 我想如果設備處於某種處理負載下是可能的。

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

首先 ,請閱讀Apple文檔

用戶點擊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
    {
    }
}
  • 應用:didReceiveLocalNotification:

當正在運行的應用程序收到本地通知時發送給代理。

檢查一下:

iOS UILocalNotification - 當應用程序在后台運行時觸發沒有委托方法,並且在通知時單擊圖標

點擊按鈕時,使用KVO鍵值觀察來了解並執行某些操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM