2012-04-24 16 views
18

El método delegado de mi aplicación applicationDidBecomeActive: recibe dos llamadas por primera vez al iniciarse la aplicación. Tengo una parte del código que quiero ejecutar solo una vez & que he puesto en applicationDidBecomeActive:applicationDidBecomeActive llamarse dos veces

¿Qué debo hacer?

+2

¿Cómo es el seguimiento de la pila, como cuando se establece un punto de interrupción en applicationDidBecomeActive :? ¿Es exactamente lo mismo para ambas llamadas? Si no (y no debería ser), entonces eso debería llevarlo a su problema. –

Respuesta

35

Tengo el problema. Estoy usando los servicios de ubicación. Al iniciar por primera vez después de presionar "OK" en la alerta de servicios de ubicación, se llama una vez más a mi applicationDidBecomeActive, que es el comportamiento normal de iOS.

+0

Mi aplicación requiere autenticación cada vez que se activa. Con esta alerta de ubicación, se requiere que el usuario ingrese la contraseña justo después de que aparezca la alerta. Necesito evitar que ocurra esa situación. –

+0

@LocPham: Mi sugerencia sería mantener una variable de instancia en el archivo de implementación de delegado de la aplicación y el incremento es siempre que se llame a applicationDidBecomeActive. No ejecute su código de alerta de inicio de sesión cuando esta variable tenga un valor> 1. No olvide restablecerlo. Además, esta sugerencia se basa exclusivamente en su requisito sin ver su código. Podría ser una mejor manera también. – Abhinav

0

¿Ha creado posiblemente una instancia de su clase en Interface Builder AND en su código AppDelegate, tal vez?

+0

buen control hacer un NSLog (@ "% x", (int) self); en ese delegado, asegúrese de que sea la misma instancia ... –

+0

Incluso si este fuera el caso, el objeto de la aplicación solo puede tener un delegado y solo enviaría el mensaje una vez. –

+0

@Grady: hay un especificador de formato para los punteros: 'NSLog (@"% p ", self);' –

0

Si tiene código que desea llamado una sola vez cuando la aplicación se inicia, a continuación, utilizar

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

lugar.

De lo contrario, se llamará a applicationDidBecomeActive siempre que su aplicación se vuelva a activar, por lo que no solo significa dos veces en su caso, sino que cada vez que el usuario vuelva a su aplicación después de cambiar a otra.

+0

Cambiar entre aplicaciones está bien. Quiero que el código se ejecute también esa vez. Pero en el primer lanzamiento en sí, se llama dos veces. – Abhinav

1

No sé si esto ayudará, pero acabo de tener el mismo problema con una aplicación totalmente simple que no utiliza los servicios de ubicación, y descubrí que es una ilusión. Mire los mensajes de registro que obtuve:

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: 

Mire de cerca. Mire veces. El primer y el tercer mensaje tienen el mismo tiempo. El segundo y el cuarto mensaje tienen el mismo tiempo. ¡Son los mismos mensajes! Es un error de Xcode; no tiene nada que ver con mi código. Xcode informa los mismos mensajes de registro dos veces.

En mi caso, pude evitar esto desactivando todos los comportamientos para ejecutar -> Genera salida.

9

Esto se debe a la ubicación o a la alerta de notificación de inserción.

Después de que se haya descartado la notificación de ubicación/inserción nativa, se llamará a applicationDidBecomeActive.

+2

¿Cómo podemos distinguir correctamente entre una aplicación "verdadera" y DidBecomeActive: cuando nuestra aplicación fue realmente en segundo plano, o la fuerza entró en segundo plano debido a la alerta de ubicación? –

+0

Mi aplicación requiere autenticación cada vez que se activa. Con esta alerta de ubicación, se requiere que el usuario ingrese la contraseña justo después de que aparezca la alerta. Necesito evitar que ocurra esa situación. –

2

Con Xcode 6 hay una nueva razón por la que esto puede suceder: cuando se inicia una aplicación en un simulador de tamaño variable, applicationDidBecomeActive: se llamará dos veces. Lanza la aplicación con la clase de tamaño predeterminada y luego aplica el tamaño que usaste por última vez, incluso si usabas los valores predeterminados. Cada vez que se aplica un cambio en la clase de tamaño, se llama a applicationDidBecomeActive.

7

Si desea llamar su código solo una vez cuando la aplicación se activa, intente llamarlo desde dos métodos. 1. didFinishLaunchingWithOptions 2. applicationWillEnterForeground

en lugar de llamarlo solo desde applicationDidBecomeActive.

+1

Esta debería ser la respuesta aceptada. – Darko

0

¿Qué hay de:

  • Incremento en applicationDidBecomeActive
  • decremento en los eventos de devolución de llamada de solicitudes de permisos u otras alertas que desencadenan otra applicationDidBecomeActive cuando está cerrado.
0

Cuando aplicación lanza primera tiempo que llama secuencialmente,

  1. didFinishLaunchingWithOptions
  2. applicationDidBecomeActive (Dos veces)

Cuando abrimos la Control Center que llama solamente,

applicationDidBecomeActive 

Cuando aplicación provienen de poner en primer plano de fondo se llama secuencialmente

  1. applicationWillEnterForeground
  2. applicationDidBecomeActive