2009-09-21 3 views
2

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

+0

Вы имеете в виду push-уведомление или NSNotification? NSNotification - это просто, но не совсем то, что вам нужно. Что касается push-уведомлений, я никогда их не видел. –

ответ

1

Если у вас есть в переменной date в NSDate, и хотите, чтобы огнь метода 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]; 
+0

Привет, PeyloW, Я пробовал свой код следующим образом, но у меня есть NSInvalidArgumentException. Можете ли вы сказать мне, что я делаю здесь неправильно --- Этот код находится внутри другой функции NSDate * date = [[NSDate alloc ]в этом]; \t date = [NSDate date]; \t NSTimer * Таймер = [[NSTimer Alloc] initWithFireDate: Дата \t \t \t \t \t интервал: 0.не 0f \t \t \t \t \t Цель: На себя \t \t \t \t селектор: @selector (dateIsHere :) \t \t \t \t \t UserInfo: ноль \t \t \t \t \t повторов: NO]; \t [[NSRunLoop mainRunLoop] addTimer: таймер \t \t \t forMode: NSDefaultRunLoopMode]; --- - (void) dateIsHere { \t NSLog (@ "Date is here"); } Спасибо – felix

+0

Я нашел проблему. У меня должен быть установлен таймер даты: (NSTimer *). Я не включил аргумент таймера. :) – felix

0

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

5

Создать 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 в.

+0

делает это, даже если приложение закрыто? – cone

1

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

Кроме того, iPhone поднимет оповещение, предлагая пользователю открыть приложение, но они могли бы не делать этого.

0

Вы ищете «Локальные уведомления», который реализуется в прошивке начиная с версии 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 слишком много хлопот для большинства)

Смежные вопросы