Регистрация уведомления в iPhone SDK 3.0 - PullRequest
2 голосов
/ 21 сентября 2009

В iPhone SDK 3.0 я хотел бы зарегистрироваться для получения уведомления, которое сообщит моему приложению о достижении определенного времени. Является ли это возможным? Спасибо

Ответы [ 5 ]

5 голосов
/ 21 сентября 2009

Установите NSTimer, который запускает селектор каждые 30 секунд (или любую необходимую степень детализации):

 [NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];

Селектор (метод) -timerFired: будет запускаться каждые тридцать секунд и проверять часовой, минутный и второй компоненты, вызывая уведомление, если элементы соответствуют требуемому времени:

 - (void) timerFired:(NSNotification *)notification {
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSCalendarUnit unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDate *date = [NSDate date];
    NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date];
    NSInteger hour =  [dateComponents hour];
    NSInteger min =   [dateComponents minute];
    NSInteger sec =   [dateComponents second];
    if ((hour == kDesiredHour) && (min == kDesiredMinute) && (sec == kDesiredSecond)) {
       [[NSNotificationCenter defaultCenter] postNotificationName:@"kTimeComponentsWereMatched" object:nil userInfo:nil];
    }
 }

Вы регистрируетесь, чтобы прослушать это уведомление в каком-то другом классе:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"kTimeComponentsWereMatched" object:nil];

Соответственно, у вас есть метод в том же классе, который делает что-то интересное:

 - (void) doSomething:(NSNotification *)notification {
    // do something interesting here...
 }

Вы можете объединить этот код, если он все в одном классе. Или укажите target в NSTimer, чтобы указать на экземпляр класса, для которого вы хотите запустить selector in.

1 голос
/ 21 сентября 2009

Если у вас есть NSDate в переменной date и вы хотите запустить метод dateIsHere: на эту дату, сделайте следующее:

NSTimer* timer = [[NSTimer alloc] initWithFireDate:date
                                          interval:0.0f
                                            target:self
                                          selector:@selector(dateIsHere:)
                                          userInfo:nil
                                           repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:timer
                          forMode:NSDefaultRunLoopMode];
[timer release];
1 голос
/ 21 сентября 2009

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

Кроме того, iPhone будет выдавать предупреждение с просьбой открыть приложение, но они могут не делать этого.

0 голосов
/ 02 сентября 2010

Вы ищете "Локальные уведомления", которые внедряются в iOS начиная с версии 4.0:

http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008194-CH1-SW1

Это должен быть правильный ответ для> = 4.0. Для более ранних версий, вероятно, все еще есть только NSNotifications (реализация push слишком сложна для большинства)

0 голосов
/ 21 сентября 2009

Вы начнете с установки NSTimer на определенную дату, и селектор, который срабатывает, может быть тем, что вы хотите. Нет необходимости использовать NSNotifications.

...