2015-08-03 3 views
6

Dans iOS 9, le code suivant pour détecter une notification ne déclenche pas la méthode de sélection. Dans les versions précédentes (par exemple 8.4), ça fonctionne bien. Quelqu'un sait-il pourquoi?iOS 9 Rappel UIApplicationDidBecomeActiveNotification non appelé

[[NSNotificationCenter defaultCenter]addObserver:self 
             selector:@selector(yourMethod) 
              name:UIApplicationDidBecomeActiveNotification 
              object:nil]; 

- (void)yourMethod {NSLog(@"aaaaaaa");} 
+0

Comme iOS 9 est en version bêta, vous pourriez obtenir une meilleure réponse sur les forums de développeurs d'Apple. –

Répondre

-1

Je fais un registre de notification comme ça.

[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourMethod:) name:UIApplicationDidBecomeActiveNotification object:nil]; 

Méthode d'écriture comme ça.

- (void)yourMethod:(NSNotification *)notification 
    { 
    NSLog(@"aaaaaaa"); 
    } 

De même, vous devez vous connecter à AppDelegate.m et voir la console de connexion.

-(void)applicationDidBecomeActive:(UIApplication *)application{ 
     NSLog(@"applicationDidBecomeActive"); 
} 
+0

Cela ne fait rien de plus que de répéter le problème –

+0

Vous pouvez dire un peu. Mais en fait lui a dit un moyen d'enquêter. –

2

Tout en faisant quelques tests, je note que la notification est effectivement déclenchée, mais pas au moment du lancement (ou au moins trop tôt pour être pris par votre observateur) (sur le simulateur ne). Essayez de tirer le centre de notification vers le haut et vers le haut ou le centre de contrôle vers le haut et vers le bas, et vous verrez que votre méthode sera effectivement appelée.

Je suggérerais peut-être d'appeler votre méthode manuellement sur iOS 9, lorsque votre application démarre?

Sur un périphérique réel, la méthode est appelée comme sur iOS 8.

Modifier: après enquête, il semble que la notification est en fait pas déclenché chaque fois sur les appareils:/

3

J'ai le même problème et pour moi cela a fonctionné pour déplacer le code addObserver vers awakeFromNib. Une autre solution pourrait être d'ajouter un délai à l'addObserver comme dans l'exemple ci-dessous:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 
}); 
0

Je suis également tombé sur ce problème et en ajoutant l'observateur avec un retard ne résout pas dans mon cas. Géré pour se débarrasser de lui en appelant la méthode directement dans AppDelegate et de la file d'attente principale, sans délai.

Swift:

func applicationDidBecomeActive(application: UIApplication) { 

    dispatch_async(dispatch_get_main_queue()) {() -> Void in 

     yourMethod() 
    } 
} 
6

Ce lien ci-dessous peut-être aider votre problème.

Foundation Release Notes for OS X v10.11

Utilisez "addObserverForName" au lieu de "addObserver".

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification 
                 object:nil 
                 queue:[NSOperationQueue mainQueue] 
                usingBlock:^(NSNotification * Nonnull note) { 
                 [self yourMethod]; 
                }]; 

Cela fonctionnera.

+0

Si vous voulez utiliser 'addObserver:', votre application doit avoir un contenu d'interface utilisateur utilisant 'NSNotificationCenter'. – jypark

+0

Vous avez raison, merci beaucoup. – Jerome

0

J'ai eu le même problème seulement sur les vrais appareils exécutant iOS 9.0 et plus.

je fini par définir ma propre notification:
(cette définition devrait être disponible au niveau mondial, constants.h ou similaire)

#define myAppBecameActiveNotif @"Tito, your app is active" 

Ensuite, dans votre implémentation de AppDelegate (AppDelegate.m la plupart des cas) vous implémentez applicationDidBecomeActive méthode déléguée:

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [[NSNotificationCenter defaultCenter] postNotificationName:myAppBecameActiveNotif 
                  object:nil]; 
    }); 
} 

(seulement retarder l'envoi de votre notification un peu, de laisser vos composants viennent à la vie)

Maintenant, dans la classe que vous souhaitez être informé de l'application est devenu actif que vous faites

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(whatToDoWhenAppActive:) 
               name:myAppBecameActiveNotif 
               object:nil]; 

Travailler bien maintenant. Vous verrez que vous ne pouvez pas sentir ce retard de 500ms ...