2009-09-21 5 views
2

Dans l'iPhone SDK 3.0, je souhaite m'enregistrer pour recevoir une notification qui alerterait mon application à un certain moment. C'est possible? MerciEnregistrement d'une notification dans l'iPhone SDK 3.0

+0

Voulez-vous dire notification push ou NSNotification? NSNotification est facile, mais pas exactement ce dont vous avez besoin. En ce qui concerne les notifications push, je n'ai jamais vraiment compris. –

Répondre

1

En supposant que vous avez un NSDate dans la date variable et que vous voulez tirer la méthode dateIsHere: à cette date, faites ceci:

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

Salut PeyloW, J'ai essayé votre code de la manière suivante, mais j'ai reçu une exception NSInvalidArgumentException.Pouvez-vous me dire ce que je fais ici incorrectement --- Ce code est dans une autre fonction NSDate * date = [[NSDate alloc ] init]; \t date = [date NSDate]; \t NSTimer * timer = [[NSTimer alloc] initWithFireDate: Date \t \t \t \t \t intervalle: 0.0f \t \t \t \t \t cible: self \t \t \t sélecteur \t: @selector (dateIsHere :) \t \t \t \t \t userInfo: néant \t \t \t \t \t répétitions: NO]; AddTimer: minuteur \t \t \t \t [[NSRunLoop mainRunLoop] addTimer: minuterie: NSDefaultRunLoopMode]; --- - (void) dateIsHere { \t NSLog (@ "La date est ici"); } Merci – felix

+0

J'ai trouvé le problème. Je dois avoir le dateIsHere funtcion lik dateIsHere: (NSTimer *) timer. Je n'ai pas inclus l'argument timer. :) – felix

0

Vous commenceriez par définir un NSTimer à tirer à une certaine date, et le sélecteur qui se déclenche pourrait être ce que vous voulez. Pas besoin d'utiliser NSNotifications.

5

Mettre en place un NSTimer qui exécute un sélecteur toutes les 30 secondes (ou quelle que soit la granularité dont vous avez besoin):

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

Le sélecteur -timerFired: (méthode) se déroulera toutes les trente secondes et vérifier l'heure, minute et seconde composantes , tirant une notification si des éléments correspondent à l'heure souhaitée:

- (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]; 
    } 
} 

Vous vous inscrivez pour écouter cette notification dans une autre classe quelque part:

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

Par conséquent, vous avez une méthode dans cette même classe qui fait quelque chose d'intéressant:

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

Vous pouvez fusionner ce code si elle est dans une classe. Ou préciser le target dans le NSTimer pour pointer vers l'instance de classe que vous souhaitez exécuter le selector dans.

+0

cela fonctionne-t-il même si l'application est fermée? – cone

1

Je suppose que vous voulez que cette minuterie à feu, même si l'application est fermée. Vous pouvez utiliser une notification pour cela, mais vous devez avoir un serveur qui a émis la notification.

En outre, l'iPhone afficherait une alerte demandant à l'utilisateur d'ouvrir l'application - mais ils pourraient choisir de ne pas le faire.

0

Vous recherchez « Notifications locales », qui est en cours d'exécution dans iOS depuis la version 4.0:

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

Cela devrait être la bonne réponse pour> = 4.0. Pour les versions antérieures, il n'y a probablement encore que NSNotifications (la mise en œuvre d'un push est trop fastidieuse pour la plupart)

Questions connexes