запланированное локальное уведомление не сохраняется в массиве scheduleLocalNotification - PullRequest
2 голосов
/ 03 января 2012

В настоящее время я планирую локальные уведомления, которые будут появляться один раз в день в 18:00, если пользователь еще не открыл приложение в тот день. Если пользователь уже загрузил приложение, я хочу отменить уведомление на этот день и назначить новое на завтра в 6 вечера. Уведомление отображается правильно, однако, когда я пытаюсь перебрать список запланированных уведомлений (это не единственное локальное уведомление, которое есть в приложении), массив [[UIApplication sharedApplication] scheduleLocalNotifications] всегда пуст. Ниже приведен фрагмент кода, который доставляет мне неприятности:

// See if we need to create a local notification to tell the user that they can receive a daily reward
NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; // <- This is always empty
// Iterate over all the pending notifications
for( int iter = 0; iter < [notifications count]; iter++ )
{
    UILocalNotification* localNotification = [notifications objectAtIndex:iter];

    if( [[localNotification.userInfo objectForKey:@"source"] isEqualToString:@"dailyReminder"] )
        [[UIApplication sharedApplication] cancelLocalNotification:localNotification];
}

NSCalendar* calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[calendar setTimeZone:[NSTimeZone localTimeZone]];
NSDateComponents *nowComponents = [calendar components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSSecondCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:serverDate];

int hour = [nowComponents hour];
int minute = [nowComponents minute];
int second = [nowComponents second];

int hoursToAdd = 18 - hour;

NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setDay:1];
[comps setHour:hoursToAdd];
[comps setMinute:-minute];
[comps setSecond:-second];
NSDate *tomorrow6PM = [calendar dateByAddingComponents:comps 
                                                toDate:serverDate
                                               options:0];

NSMutableDictionary* userInfo = [NSMutableDictionary dictionary];
[userInfo setObject:@"dailyReminder" forKey:@"source"];

scheduleNotification(tomorrow6PM, NSLocalizedString(@"Come Back!", @"daily reminder notification message"), NSLocalizedString(@"Launch", @"daily reminder notification button text"), [UIApplication sharedApplication].applicationIconBadgeNumber+1, userInfo);

Функция scheduleNotification проста и просто создает локальное уведомление:

void scheduleNotification(NSDate* fireIn, NSString* bodyText, NSString* alertText, NSUInteger badgeCount, NSMutableDictionary* userInfo)
{
static int appCount = 0;
appCount += 1;

if(!isLocalNotificationEnabled()) 
    return;

Class localNotificationClass = NSClassFromString(@"UILocalNotification");
UILocalNotification* localNotification = [[localNotificationClass alloc] init];
if(!localNotification)
    return;

localNotification.fireDate = fireIn;
localNotification.timeZone = [NSTimeZone systemTimeZone];
localNotification.alertBody = bodyText;
localNotification.alertAction = alertText;
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.applicationIconBadgeNumber = badgeCount;
localNotification.userInfo = userInfo;

[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[localNotification release];
}

Я не понимаю, почему массив локальных уведомлений всегда пуст. Как я уже говорил, уведомления отображаются в нужное время, поэтому они планируются. Любая помощь приветствуется.

Ответы [ 3 ]

7 голосов
/ 10 июля 2012

Схожие проблемы прямо сейчас.Я предполагаю, что iOS не планирует уведомления сразу, а только в конце текущего цикла выполнения.Я сталкиваюсь с этими проблемами, когда несколько раз устанавливаю свойство scheduleLocalNotifications в одном цикле выполнения, и изменения не обновляются соответствующим образом.Я думаю, что я просто сохраню копию локального массива уведомлений, установлю только scheduleLocalNotifications и никогда не читаю.

1 голос
/ 20 декабря 2012
localNotification.fireDate = fireIn;

в этой строке проверьте, есть ли "fireIn" является объектом NSDate или NSString.

Если это NSString, преобразуйте его в NSDate объект ссправка по NSDateformatter и последующая передача localNotification fireDate.

Ранее я сталкивался с той же проблемой и решил ее с помощью вышеупомянутых шагов.

0 голосов
/ 04 января 2012

Если в расписании указана недопустимая дата запуска, оно не будет запланировано, и в результате будет возвращен пустой массив, поскольку у него никогда не было действительного расписания, попробуйте распечатать свое localNotification, как показано ниже, вы можете обнаружить проблему.

NSLog(@"Notification--->: %@", localNotification);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...