2013-01-09 48 views
2

我在我的應用中使用UILocalNotification s。有時我會安排重複通知,有時還會發送非重複通知。每當通知觸發時,我想增加應用程序徽章號碼。所以我做localNotification.applicationIconBadgeNumber = badgeNumber;這工作正常...除了當通知是重複通知,因爲如果我以前設置了1號徽章的重複通知,然後我設置另一個非重複通知2號徽章。重複的UILocalNotification應用徽章編號

流是這樣的:

Notification 1 fires (first time) - Badge number = 1 (OK!) 
Notification 2 fires    - Badge number = 2 (OK!) 
Notification 1 fires (repeating) - Badge number = 1 (ERROR) 

當你明白的時候通知1個再次開火我仍然希望被顯示的應用程序徽章編號2(2遺漏的通知)。我能否實現這種行爲?還是有什麼明顯的我錯過了?對我來說,重複通知的邏輯徽章行爲更符合邏輯,因爲它第一次設置了徽章號碼,並且在以後的時間裏它不會更改徽章號碼。

+0

不錯的問題! –

+0

以下是可能的解決方法:http://stackoverflow.com/a/15461328/1869369使用推送通知不是必需的 –

回答

1

我想處理有反覆通知的唯一途徑,也有它增加了應用程序的徽章數量第一次它的發射是安排您的repated通知沒有像證件號碼:

UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60]; 
localNotification.alertBody = @"1"; 
localNotification.alertAction = @"Send"; 
localNotification.soundName = UILocalNotificationDefaultSoundName; 
localNotification.timeZone = [NSTimeZone defaultTimeZone]; 
localNotification.repeatInterval = NSMinuteCalendarUnit; 
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 

,然後安排通知只設置應用程序徽章數量在重複通知首次發射同一時間:

UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60]; 
localNotification.soundName = UILocalNotificationDefaultSoundName; 
localNotification.timeZone = [NSTimeZone defaultTimeZone]; 
localNotification.applicationIconBadgeNumber = 1; 
localNotification.hasAction = NO; 
localNotification.alertBody = nil; 
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
+1

這是如何被接受的答案?在什麼時候增加徽章數量? – Teevus

+0

我真的不明白你的問題嗎? –

0

您可以簡單地執行它使用if條件,如:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)localNotification 
{ 
    if([UIApplication sharedApplication].applicationIconBadgeNumber < localNotification.applicationIconBadgeNumber) 
    { 
     [UIApplication sharedApplication].applicationIconBadgeNumber = localNotification.applicationIconBadgeNumber; 
    } 
} 

(沒檢查上面的代碼)。

+0

您需要通過本地通知設置應用徽章編號,如'firstLocalNotification.applicationIconBadgeNumber = 1''secondLocalNotification.applicationIconBadgeNumber = 2' –

+0

你,我正在那樣做。首先檢查應用程序徽章號是否小於當前觸發的通知徽章號。如果是,那麼我將其設置爲應用程序的徽章號​​碼。如果不是這意味着它是重複通知。 –

+0

我真的不明白你在說什麼。你能爲此顯示完整的代碼嗎? –

1

簡單:對不起,戴夫。恐怕我不能那樣做。

當使用UILocalNotification時,無法讓徽章計數保持在「最高」數量上,因爲您希望使用此徽章。

徽章計數將始終設置爲您在安排通知時設置的值(如您所知)。您無法假定用戶每次收到通知時都會打開您的應用程序,因此在每次應用程序啓動時更新已安排的通知(重複和不重複)的徽章計數將無法正常工作,並且不會成爲選項。

要做到這一點,唯一的方法就是使用推送通知,在您的服務器上跟蹤所有「未讀」通知,並在用戶啓動應用後立即將通知標記爲「已讀」。

+0

其實我認爲你錯了,確實有可能跟蹤所有通知,這很簡單,因爲當應用程序進入後臺時,你會檢查需要創建多少通知,然後安排它們。對於每個通知你增加'applicationIconBadgeNumber'這非常適用於非重複通知。但是這個問題是在我重複提醒的時候發生的,我試圖在我的問題中解釋。 –

+0

但是,您將不得不在每次啓動應用程序時更新所有計劃通知的徽章計數。假設您安排20個通知,您將徽章計數設置爲1 ... 20。三個通知被觸發,徽章數量爲3,用戶打開該應用程序,並在此情況下重新設置徽章計數作爲一名優秀的開發人員。那麼你必須更新通知4 ... 20的徽章數量?這對我來說聽起來不太好,但它可以解決非重複通知的問題。 –

+0

在我的情況下,每個徽章號代表一個逾期的對象,所以僅僅因爲用戶打開應用程序並不意味着我應該重置應用程序徽章(如果用戶打開應用程序,對象仍然過期)。 –

0

在我的應用程序,我不得不添加使用重複本地通知證件號碼。每次用戶打開應用程序徽章號碼應重新設置。因此,所有計劃的通知都應重新計算徽章號碼。

func applicationDidEnterBackground(application: UIApplication) { 
    addBadgeNumberToScheduledNotifications() 
} 

func addBadgeNumberToScheduledNotifications() { 
    var badgeNumber: Int = 0 
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0 
    if let notifications = UIApplication.sharedApplication().scheduledLocalNotifications { 
     UIApplication.sharedApplication().cancelAllLocalNotifications() 
     for notification in notifications { 
      notification.applicationIconBadgeNumber = notification.fireDate > NSDate() ? ++badgeNumber : 0 
      UIApplication.sharedApplication().scheduleLocalNotification(notification) 
     } 
    } 
}