[英]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];
我的想法:當用戶在通知警報動畫完成之前滑動時會發生這種情況。 如果他在滑動之前等待半秒鍾 - 通知被解雇,應用程序按預期進行。 問題可能是應用程序在收到通知之前進入前台。
有沒有人見過這個? 這是一個錯誤嗎? 有解決方案嗎 謝謝!
您的應用程序是在后台還是前台? 如果它在前台,我很確定該方法被調用。 如果不是,也許您沒有將該方法放在您的應用程序委托中。
如果是在后台,這里有幾種可能的情況:
您的應用已被用戶或操作系統殺死。 在這種情況下,當用戶通過點擊通知中心上的通知(或在鎖定屏幕中滑動)喚醒您的應用程序時,您的應用程序委托將調用application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法。 您可以通過以下方式獲取此方法的通知:
[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
您的應用程序位於后台,用戶點擊通知中心或鎖定屏幕中的通知。 在這種情況下,不會調用任何委托方法 。 該文檔明確指出didReceiveLocalNotification:
適用於應用程序位於前台的時間:
如果應用程序在前台運行,則沒有警報,徽章或聲音; 相反,如果委托實現它,則調用application:didReceiveLocalNotification:方法。
因此,希望您能夠在收到通知時做出明智的決定。 我個人覺得當用戶通過點擊圖標(而不是通知)啟動應用程序時,我們沒有獲得通知對象有點奇怪。 但我現在只是圍繞它編寫我的邏輯。
Apple在其文檔( 本地和遠程通知編程指南 )中明確提到,根據應用程序處於什么狀態以及用戶采取的操作(如Enrico所述),可以調用不同的方法。
摘要:
所以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.