2015-11-10 127 views
1

我有一個圖標徽章號碼更新要求。該應用跟蹤任務。我希望應用程序擁有顯示每天到期任務數量的徽章。當徽章號碼需要更新時基本上有兩種情況:更新iOS圖標徽章號碼

  1. 每天午夜。
  2. 如果添加新任務或刪除任務。

我知道如何處理第二種情況。我可以在applicationResignActive函數中設置徽章號碼。但是,午夜自動更新對我來說是個詭計。要更新徽章號碼,我需要調用應用程序的func來計算當天到期的任務。但是,在午夜時間,應用程序可能處於所有可能的情況:前景,背景和未運行。我怎樣才能做到這一點?謝謝。

=====================================

要以更清楚我的要求,我希望每天都能正確更新徽章號碼,即使用戶從不打開一整天或連續幾天的應用程序。此外,我會盡量避免服務器端的支持,因爲該應用程序到目前爲止是一個獨立的應用程序。非常感謝您的幫助。

=====================================

最後更新:我接受維塔利的回答。但是,他的回答要求應用程序每天至少打開一次。否則,該事件不會觸發,並且徽章號碼不能更新。

此外,就我而言,每次應用程序進入後臺事件觸發時,我都必須刪除現有通知並安排新的通知,並重新計算最新的徽章號。

我仍然對某種方式來處理應用程序不是每天打開的情況感興趣,您如何確保徽章號碼是正確的。到目前爲止,最簡單的方法是設置一些服務器並定期將通知推送到應用程序。

+0

你應該更具體 - 閱讀這聽起來像你沒有讀過任何關於如何做推送通知或後臺任務。 – inorganik

+0

我認爲你可以嘗試蘋果推送通知來完成第一個案例。使用服務器端更新應用程序中的任務。 APN服務教程:http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1 –

+0

目前爲止還沒有針對該應用的服務器端編程。該應用程序專爲使用沒有服務器端支持。所以我想避免將某些計算邏輯移到服務器端來純粹用於更新徽章的目的。 – Steve

回答

2

你可以用UILocalNotification實現它:

  1. 當應用程序被切換到後臺,精確計算徽章計數爲最近的午夜
  2. 附表UILocalNotification在最近的午夜您的計算徽章數
  3. 你會午夜獲得通知,並且應用的徽章數量將更新

示例代碼:

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    // Calculate nearest midnight or any other date, which you need 
    NSDate *nearestMidnight = [self nearestMidnight]; 
    // Create and setup local notification 
    UILocalNotification *notification = [UILocalNotification new]; 
    notification.alertTitle = @"Some title"; 
    notification.alertBody = @"Some message"; 
    notification.fireDate = nearestMidnight; 
    // Optional set repeat interval, if user didn't launch the app after nearest midnight 
    notification.repeatInterval = NSCalendarUnitDay; 
    // Calculate badge count and set it to notification 
    notification.applicationIconBadgeNumber = [self calculateBadgeCountForDate:nearestMidnight]; 
    [application scheduleLocalNotification:notification]; 
} 
+0

用戶從未打開過一天的應用程序?如果用戶從不打開連續x天的應用程序會怎麼樣?徽章號碼是否每天都會正確更新? – Steve

+0

@Steve:你有沒有試過? –

+0

@QuangHà不,我還沒有嘗試Vitaliy的方法。但是,通過閱讀代碼,我可以看到它調用calculateBadgeCountForDate來獲取第二天的事件計數並分配給通知。我懷疑,如果用戶沒有打開一整天的應用程序,applicationDidEnterBackground方法將不會被調用。所以徽章號碼將保持不變。只有當用戶每天打開一次應用程序時,徽章號碼纔會更新。這是我通過閱讀代碼的理解。如果我錯了,請糾正我。 – Steve