2013-10-13 155 views
1

我試圖建立一個UILocalNotification使用下面的邏輯,每30秒運行,但它似乎是行爲不端。有兩個問題:UILocalNotification每30秒

  1. 當通知被解僱時,似乎有很多人都是一次性的,而不是每30秒一次。
  2. 應用程序圖標徽章編號似乎並未增加。它只是停留在1.

請有人能幫我弄清楚我做錯了什麼嗎?

// Create 'base' notification we can use 
UILocalNotification *baseNotification = [[UILocalNotification alloc] init]; 
baseNotification.timeZone = [NSTimeZone defaultTimeZone]; 
baseNotification.repeatInterval = NSMinuteCalendarUnit; 
baseNotification.alertBody = @"My Message."; 
baseNotification.alertAction = @"My Alert Action"; 
baseNotification.soundName = UILocalNotificationDefaultSoundName; 

UILocalNotification *alertOne = [baseNotification copy]; 
alertOne.applicationIconBadgeNumber++; 
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertOne]; 

UILocalNotification *alertTwo = [baseNotification copy]; 
alertTwo.applicationIconBadgeNumber++; 
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertTwo]; 
+0

你是什麼意思的「當通知被解僱」?你是否一次看到很多通知提醒,或者'application:didReceiveLocalNotification:'方法被多次調用? – Hejazi

+0

我的意思是我一次看到很多通知警報。 –

+0

你是否通過調用'cancelAllLocalNotifications'來取消所有先前的預定警報? – Hejazi

回答

1

目前沒有辦法實現具有間隔的自定義重複。

但是,通知系統最多可以排隊64個通知,所以您可以做的最接近的事情是手動設置儘可能多的通知(每個通知都有不同的徽章號和不同的fireDate),然後當您的通知列表不足時,通過設置新的通知列表來更新您的通知列表。

這將返回隊列中有多少條信息已經:

[[[UIApplication sharedApplication] scheduledLocalNotifications] count] 

還有這個職位,我建議你閱讀進一步的幫助:

iOS badge number live update

祝你好運!

0

關於第二點,您將增加副本的徽章號碼而不是原始通知。而且,由於原來的具有零徽章號您總能獲得零證件號碼複製過,增加這將使它始終爲1

的解決方案是增加原來通知的徽章權作出複製前:

... 
baseNotification.applicationIconBadgeNumber++; 
UILocalNotification *alertOne = [baseNotification copy]; 
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertOne]; 

baseNotification.applicationIconBadgeNumber++; 
UILocalNotification *alertTwo = [baseNotification copy]; 
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertTwo]; 
0

根據NSObject類參考:

副本 - 返回copyWithZone返回的對象:

而且copyWithZone返回淺拷貝。 所以它像所有的通知具有相同的屬性。 因此,徽章號碼始終爲「1」,並且fireDate對於所有通知都相同。即您申請的最後一個。 因此,通知同時被觸發。

希望,它幫助。

+0

謝謝 - 你知道是否有方法可以複製它們,使得值不完全相同? –

+1

爲什麼不做一個新的實例?據我所知深入複製,你必須實現copyWithZone:該對象,這不是在UILocalNotification類的情況下的解決方案。 –

2

試試這一個。

UILocalNotification *baseNotification = [[UILocalNotification alloc] init]; 
baseNotification.timeZone = [NSTimeZone defaultTimeZone]; 
baseNotification.repeatInterval = NSMinuteCalendarUnit; 
baseNotification.alertBody = @"My Message."; 
baseNotification.alertAction = @"My Alert Action"; 
baseNotification.soundName = UILocalNotificationDefaultSoundName; 

UILocalNotification *alertOne = [baseNotification copy]; 
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
alertOne.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1; 

UILocalNotification *alertTwo = [baseNotification copy]; 
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; 
alertTwo.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1; 
0

我覺得你得到了很多的通知每30秒是因爲你沒有取消之前的通知。在代碼頂部添加此行。

[[UIApplication sharedApplication] cancelAllLocalNotifications];