Pregunta

Mi aplicación utiliza NSTimer y parece que NSTimer no se dispara cuando el iPhone entra en modo de espera (ya sea presionando el botón de hardware o con el temporizador de inactividad).

Cuando vuelvo a activar el iPhone, mi aplicación todavía está en primer plano. ¿Qué sucede con las aplicaciones de terceros cuando el iPhone es el modo de espera?

¿Fue útil?

Solución

Aunque no es evidente aquí, creo que el póster original encontró una respuesta a su pregunta al iniciar un hilo ( disponible aquí ) en los foros de desarrolladores de iPhone (que finalmente tuve que encontrarme porque la información no se compartió aquí).

En caso de que alguien más tenga la misma pregunta y encuentre la página en el futuro, aquí hay una respuesta útil que fue publicada por alguien en el foro de Apple llamada " eskimo1 " (que he editado ligeramente para que sea más fácil de leer sin tener el contexto proporcionado por todo el hilo original):

  • En cuanto a la terminología del estado de la aplicación del iPhone, " activo " no significa "despierto", significa "adjunto a la GUI". Piense que es análogo a " frontmost " en Mac OS X. Cuando bloquea el dispositivo, su aplicación se desactiva, pero el dispositivo puede o no irse a dormir
  • el sistema operativo del iPhone rara vez se duerme si el dispositivo está conectado a la alimentación principal (es decir, a través de USB). Sin embargo, puede dormir si funciona con batería.
  • Poco tiempo después de que la pantalla se bloquee (20 segundos según Oliver Drobnik), el dispositivo se pone en espera. Esto es como cerrar la tapa de su computadora portátil; Toda la actividad en la CPU principal se detiene.
  • Esto no sucede si el dispositivo está reproduciendo audio en la sesión de audio correcta. Consulte Sesión de audio de QA1626 " DTS: garantizar una reproducción de audio continua cuando la pantalla está bloqueado " para más detalles.
  • Tenga en cuenta que la propiedad idleTimerDisabled (que se puede activar para evitar que la pantalla se apague mientras se ejecuta la aplicación) trata de bloquear la pantalla después de la inactividad del usuario. No está directamente relacionado con la suspensión del sistema (está relacionado de manera indirecta, ya que el sistema puede quedarse inactivo poco después de que se bloquee).

Otros consejos

Consulte Interrupciones de la aplicación en la Guía de programación del iPhone OS , especialmente los eventos applicationWillResignActive y applicationDidBecomeActive . (Ciertamente vale la pena leer la guía completa). Cuando ignora los eventos, el temporizador parece continuar durante un tiempo y luego se detiene. Suena lógico, la aplicación podría agotar fácilmente la batería si se sigue ejecutando. ¿Y qué pasa exactamente con la aplicación? Supongo que simplemente no obtiene ningún tiempo de CPU & # 8211; se congela y solo se descongela cuando enciende la máquina & # 8220 ;. & # 8221;

Mi primer consejo es que no deshabilites el temporizador de inactividad, es solo un truco. Si desea mantener un temporizador activo durante los eventos de IU, ejecute el temporizador en el bucle de ejecución actual utilizando NSCommonModes:

// create timer and add it to the current run loop using common modes

self.timer = [NSTimer timerWithTimeInterval:.1 target:self selector:@selector(handleTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

Usé la información en esta publicación para una pequeña muestra que estaba construyendo. Este es el código que utilicé cuando inicié la reproducción para evitar que el audio se detuviera:

AudioSession.Category = AudioSessionCategory.MediaPlayback;

Y cuando la aplicación se realiza con la reproducción para restablecer el valor original:

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

La muestra completa está aquí:

http://github.com/migueldeicaza/monotouch-samples/ tree / master / StreamingAudio /

Recientemente me enfrenté a este problema en una aplicación en la que estoy trabajando que usa varios temporizadores y reproduce algunas indicaciones de audio e hizo dos cambios relativamente simples:

  1. En el AppDelegate implementé los siguientes métodos y su mera presencia permite que la aplicación continúe cuando la pantalla está bloqueada

    // this receives the notification when the device is locked
    - (void)applicationWillResignActive:(UIApplication *)application
    { 
    }
    
    // this receives the notification that the application is about to become active again
    - (void)applicationWillBecomeActive:(NSNotification *)aNotification
    {
    }
    

    referencias: UIApplicationDelegate Protocol Reference & amp; NSApplication Class Reference en la API doc (accesible a través de Xcode, solo busque applicationWillBecomeActive).

  2. Hizo de la clase principal viewcontroller un AVAudioPlayerDelegate y usé este código de la sección de Apple " AddMusic " muestra para hacer que las alertas de audio que la aplicación reproduce se mezclen bien con el audio del iPod, etc. ...

    Acabo de soltar este código en un método que se llama durante viewDidLoad. Si esto te interesa, caes en "quién debería leer este documento". categoría para esto: Guía de programación de sesiones de audio

    // Registers this class as the delegate of the audio session.
    [[AVAudioSession sharedInstance] setDelegate: self];
    
    // The AmbientSound category allows application audio to mix with Media Player
    // audio. The category also indicates that application audio should stop playing 
    // if the Ring/Siilent switch is set to "silent" or the screen locks.
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
    
    // Activates the audio session.
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];
    

Creo que su aplicación debería ejecutarse normalmente cuando se suspende. (piensa en Pandora Radio)

Comprueba si tu cronómetro está siendo desasignado debido a que tu vista está oculta o si ocurre algún otro evento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top