2012-04-24 22 views
18

Il metodo di delegazione della mia app applicationDidBecomeActive: viene chiamato due volte per la prima volta che si avvia l'applicazione. Ho una parte di codice che voglio eseguire solo una volta & che ho inserito in applicationDidBecomeActive:applicationDidBecomeActive chiamato per due volte

Cosa devo fare?

+2

Cosa l'analisi dello stack simile a quando si imposta un punto di interruzione applicationDidBecomeActive :? È esattamente lo stesso per entrambe le chiamate? Se no (e non dovrebbe essere), allora questo dovrebbe portarti al tuo problema. –

risposta

35

Ho riscontrato il problema. Sto usando i servizi di localizzazione. Quando si avvia per la prima volta dopo aver toccato "OK" nell'avviso di servizi di localizzazione, la mia applicationDidBecomeActive viene chiamata ancora una volta, che è il normale comportamento di iOS.

+0

La mia app richiede l'autenticazione ogni volta che diventa attiva. Con questo avviso di posizione, l'utente è tenuto a digitare la password subito dopo l'avviso. Ho bisogno di evitare che questa situazione accada. –

+0

@LocPham: il mio suggerimento è di mantenere una variabile di istanza nel file di implementazione del delegato dell'app e l'incremento è ogni volta che viene chiamato applicationDidBecomeActive. Non eseguire il codice di avviso di accesso quando questa variabile ha valore> 1. Non dimenticare di reimpostarla. Inoltre, questo suggerimento è basato esclusivamente sulla tua esigenza senza vedere il tuo codice. Potrebbe essere anche un modo migliore. – Abhinav

0

Hai forse creato un'istanza della tua classe in Interface Builder E nel tuo codice AppDelegate, forse?

+0

good check fai un NSLog (@ "% x", (int) self); in questo delegato, assicurarsi che sia la stessa istanza ... –

+0

Anche se questo fosse il caso, l'oggetto dell'applicazione stesso può avere solo un delegato e invierà il messaggio solo una volta. –

+0

@Grady: c'è un identificatore di formato per i puntatori: 'NSLog (@"% p ", self);' –

0

Se si dispone di codice che si desidera chiamato solo una volta quando l'applicazione si avvia, quindi utilizzare

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

invece.

Altrimenti, applicationDidBecomeActive viene chiamato ogni volta che l'app diventa di nuovo attiva, in modo che non significhi solo il doppio del tuo caso, ma ogni volta che l'utente ritorna alla tua app dopo il passaggio a un altro.

+0

Il passaggio tra le applicazioni va bene. Voglio che anche il codice venga eseguito in quel momento. Ma al primo lancio in sé, è stato chiamato due volte. – Abhinav

1

Non so se questo sarà d'aiuto, ma ho appena avuto lo stesso problema con un'app totalmente semplice che non utilizza i servizi di localizzazione e ho scoperto che è un'illusione. Guarda i messaggi di registrazione che ho ricevuto:

2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 
2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 

Guardi da vicino. Guarda le volte. Il primo e il terzo messaggio hanno lo stesso tempo. Il secondo e il quarto messaggio hanno lo stesso tempo. Sono gli stessi messaggi! È un bug Xcode; non ha nulla a che fare con il mio codice. Xcode sta segnalando gli stessi messaggi di registro due volte.

Nel mio caso, sono stato in grado di impedirlo disattivando tutti i Behaviors per l'esecuzione -> Genera uscita.

9

Questo a causa della posizione o di un avviso di notifica push.

Dopo che la posizione nativa/notifica push è stata chiusa, verrà chiamato applicationDidBecomeActive.

+2

Come distinguere correttamente tra una "vera" applicationDidBecomeActive: quando la nostra app è effettivamente passata in secondo piano rispetto a forzatamente è stata inserita in background a causa di un avviso di posizione? –

+0

La mia app richiede l'autenticazione ogni volta che diventa attiva. Con questo avviso di posizione, l'utente è tenuto a digitare la password subito dopo l'avviso. Ho bisogno di evitare che questa situazione accada. –

2

Con Xcode 6 c'è un nuovo motivo per cui questo può accadere: quando si avvia un'app in un simulatore ridimensionabile, applicationDidBecomeActive: verrà chiamato due volte. Avvia l'app con la classe di dimensione predefinita, quindi applica la dimensione che stavi usando per l'ultima volta, anche se stavi utilizzando i valori predefiniti. Ogni volta che viene applicata una modifica alla classe di dimensione, applicationDidBecomeActive: viene chiamato.

7

Se si desidera chiamare il proprio codice una sola volta quando l'app diventa attiva, provare a chiamarla da due metodi. 1. didFinishLaunchingWithOptions 2. applicationWillEnterForeground

invece di chiamarlo solo da applicationDidBecomeActive.

+1

Questa dovrebbe essere la risposta accettata. – Darko

0

Che dire:

  • Incremento sulla applicationDidBecomeActive
  • Decremento su eventi di callback di richieste autorizzazioni o altri avvisi che innescano un altro applicationDidBecomeActive quando è chiuso.
0

Quando app lancia prima volta chiama in sequenza,

  1. didFinishLaunchingWithOptions
  2. applicationDidBecomeActive (due volte)

Quando apriamo il Control Center chiama solo,

applicationDidBecomeActive 

Quando un'applicazione viene da sfondo al primo piano che chiama in sequenza

  1. applicationWillEnterForeground
  2. applicationDidBecomeActive
Problemi correlati