2015-08-03 18 views
6

In iOS 9 il seguente codice per rilevare una notifica non attiva il metodo di selezione. Nelle versioni precedenti (ad esempio 8.4) funziona correttamente. Qualcuno sa perché?iOS 9 UIApplicationDidBecomeActiveNotifica chiamata non chiamata

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

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

Poiché iOS 9 è in versione beta, potresti ottenere una risposta migliore nei forum degli sviluppatori Apple. –

risposta

-1

Mi registro di notifica in questo modo.

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

Metodo di scrittura simile.

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

Inoltre, è necessario NSLog in AppDelegate.m e consultare la console di accesso.

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

Questo non fa altro che ribadire il problema –

+0

Si può dire che tipo. Ma in realtà gli ha detto come indagare. –

2

Pur facendo alcuni test, ho notato che la notifica viene effettivamente attivato, anche se non al momento del lancio (o almeno troppo presto per essere catturati dal vostro osservatore) (sul simulatore unico).

Prova a tirare il centro di notifica verso il basso e verso l'alto o il centro di controllo su e giù, e vedrai che il tuo metodo verrà effettivamente chiamato.

Suggerirei di chiamare manualmente il metodo su iOS 9, quando l'app inizia?

su un dispositivo reale, il metodo viene chiamato proprio come su iOS 8.

Edit: dopo ulteriori indagini, sembra che la notifica non viene effettivamente attivato ogni volta sui dispositivi:/

3

Ho lo stesso problema e per me ha funzionato per spostare il codice addObserver su awakeFromNib. Un'altra soluzione potrebbe essere quella di aggiungere un ritardo al addObserver come nell'esempio qui sotto:

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

Ho anche imbattuto in questo problema e aggiungendo l'osservatore con un ritardo non ha risolto nel mio caso. È riuscito a sbarazzarsene chiamando il metodo direttamente in AppDelegate e dalla coda principale, senza alcun ritardo.

Swift:

func applicationDidBecomeActive(application: UIApplication) { 

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

     yourMethod() 
    } 
} 
6

Questo collegamento come di seguito forse aiutare il vostro problema.

Foundation Release Notes for OS X v10.11

Usa "addObserverForName" invece di "addObserver".

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

Sarà lavoro.

+0

Se si desidera utilizzare 'addObserver:', l'app deve avere alcuni contenuti dell'interfaccia utente che utilizzano 'NSNotificationCenter'. – jypark

+0

Hai ragione, grazie mille. – Jerome

0

Ho avuto lo stesso identico problema solo su dispositivi reali con iOS 9.0 e versioni successive.

ho finito per definire la mia notifica:
(questa definizione dovrebbe essere globalmente disponibili, constants.h o simili)

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

Poi, nell'implementazione AppDelegate (AppDelegate.m maggior parte dei casi) si sceglie di implementare applicationDidBecomeActive metodo delegato:

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

(Basta ritardare l'invio della tua segnalazione un po ', di lasciare i componenti prendono vita)

Ora, nella classe si desidera ricevere una notifica l'applicazione è diventato attivo fate

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

Lavorare bene ora. Vedrai che non riesci a sentire questo ritardo di 500 ms ...