簡體   English   中英

應用程序didReceiveLocalNotification未觸發iOS7

[英]application didReceiveLocalNotification not fired iOS7

問題:

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

有時用iOS7不會調用。 它不會影響我們如何安排通知:

alarm.fireDate = [[NSDate date] dateByAddingTimeInterval:0.1];
[app scheduleLocalNotification:alarm];

要么:

[app presentLocalNotificationNow:alarm];

我的想法:當用戶在通知警報動畫完成之前滑動時會發生這種情況。 如果他在滑動之前等待半秒鍾 - 通知被解雇,應用程序按預期進行。 問題可能是應用程序在收到通知之前進入前台。

有沒有人見過這個? 這是一個錯誤嗎? 有解決方案嗎 謝謝!

您的應用程序是在后台還是前台? 如果它在前台,我很確定該方法被調用。 如果不是,也許您沒有將該方法放在您的應用程序委托中。

如果是在后台,這里有幾種可能的情況:

  1. 您的應用已被用戶或操作系統殺死。 在這種情況下,當用戶通過點擊通知中心上的通知(或在鎖定屏幕中滑動)喚醒您的應用程序時,您的應用程序委托將調用application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法。 您可以通過以下方式獲取此方法的通知:

    [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

  2. 您的應用程序位於后台,用戶點擊通知中心或鎖定屏幕中的通知。 在這種情況下,不會調用任何委托方法 該文檔明確指出didReceiveLocalNotification:適用於應用程序位於前台的時間:

如果應用程序在前台運行,則沒有警報,徽章或聲音; 相反,如果委托實現它,則調用application:didReceiveLocalNotification:方法。

因此,希望您能夠在收到通知時做出明智的決定。 我個人覺得當用戶通過點擊圖標(而不是通知)啟動應用程序時,我們沒有獲得通知對象有點奇怪。 但我現在只是圍繞它編寫我的邏輯。

Apple在其文檔( 本地和遠程通知編程指南 )中明確提到,根據應用程序處於什么狀態以及用戶采取的操作(如Enrico所述),可以調用不同的方法。

摘要:

  • 用戶點擊iOS 8通知中的自定義操作按鈕。 在這種情況下,iOS調用application:handleActionWithIdentifier:forRemoteNotification:completionHandler:或application:handleActionWithIdentifier:forLocalNotification:completionHandler:。 在這兩種方法中,您都會獲得操作的標識符,以便您可以確定用戶點擊的按鈕。 您還可以獲得遠程或本地通知對象,以便您可以檢索處理該操作所需的任何信息。
  • 用戶點擊警報中的默認按鈕或點擊(或點擊)應用圖標。 ...系統啟動應用程序,應用程序調用其委托的應用程序:didFinishLaunchingWithOptions:方法,傳入通知有效負載(用於遠程通知)或本地通知對象(用於本地通知)。 ...
  • 當應用程序在前台運行時,將傳遞通知。 該應用程序調用UIApplicationDelegate方法應用程序:didReceiveLocalNotification:或application:didReceiveRemoteNotification:fetchCompletionHandler:。

所以didReceiveLocalNotification僅在應用程序已經運行且位於前台時觸發。 您還應該處理未運行的第二個場景,其中apple具有以下代碼示例:

Objective-C的:

- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotif) {
        NSString *itemName = [localNotif.userInfo objectForKey:ToDoItemKey];
        [viewController displayItem:itemName];  // custom method
        app.applicationIconBadgeNumber = localNotif.applicationIconBadgeNumber-1;
    }
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
    return YES;
}

Swift(由我自己提供的近似值):

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if let localNotification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification {
            if let itemName = localNotification.userInfo?[ToDoItemKey] as? String {
                handleNotification(localNotification)
                application.applicationIconBadgeNumber = localNotification.applicationIconBadgeNumber - 1
            }
    }
    .
    .
    .
}

暫無
暫無

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

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