Domanda

La mia app utilizza NSTimer e sembra che NSTimer non si attivi quando l'iPhone passa in modalità stand-by (premendo il pulsante hardware o il timer di inattività).

Quando riattivo l'iPhone, la mia app è ancora in primo piano. Cosa succede alle app di terze parti quando l'iPhone è in modalità stand-by?

È stato utile?

Soluzione

Anche se non è evidente qui, credo che il poster originale abbia trovato una risposta alla sua domanda avviando un thread ( disponibile qui ) nei forum degli sviluppatori di iPhone (che alla fine ho dovuto trovare me stesso perché le informazioni non erano condivise qui).

Nel caso in cui qualcun altro abbia la stessa domanda e trovi la pagina in futuro, ecco una risposta utile che è stata pubblicata da qualcuno sul forum Apple chiamata " eskimo1 " (che ho modificato leggermente in modo che sia più facile da leggere senza avere il contesto fornito dall'intero thread originale):

  • Per quanto riguarda la terminologia relativa allo stato delle app per iPhone, "attivo" non significa "sveglia", significa "allegato alla GUI". Pensa che sia analogo a "più in primo piano" in Mac OS X. Quando si blocca il dispositivo, l'app si disattiva ma il dispositivo potrebbe o meno passare in modalità di sospensione
  • Il sistema operativo iPhone raramente dorme se il dispositivo è collegato all'alimentazione principale (ad es. tramite USB). Può dormire se funziona a batteria, tuttavia.
  • Poco dopo aver bloccato lo schermo (20 secondi secondo Oliver Drobnik), il dispositivo si spegne. È come chiudere il coperchio del tuo laptop; tutta l'attività sulla CPU principale si interrompe.
  • Ciò non accade se il dispositivo sta riproducendo l'audio nella sessione audio corretta. Vedi DTS Q & amp; A QA1626 " Audio Session - Garantire la riproduzione audio continua quando lo schermo è bloccato " per i dettagli.
  • Nota che la proprietà idleTimerDisabled (che può essere attivata per impedire lo spegnimento dello schermo mentre l'app è in esecuzione) riguarda il blocco dello schermo dopo l'inattività dell'utente. Non è direttamente correlato alla sospensione del sistema (è indirettamente correlato al fatto che il sistema potrebbe dormire poco dopo il blocco).

Altri suggerimenti

Vedi Interruzioni dell'applicazione nella Guida alla programmazione del sistema operativo iPhone , in particolare gli eventi applicationWillResignActive e applicationDidBecomeActive . (Vale sicuramente la pena di leggere l'intera guida.) Quando ignori gli eventi, il timer sembra andare avanti per un po 'e poi si ferma. Sembra logico, l'applicazione potrebbe facilmente scaricare la batteria se mantenuta in esecuzione. E cosa succede esattamente all'applicazione? Immagino che semplicemente non ottenga alcun tempo CPU & # 8211; si blocca e si scongela solo quando riaccendi la macchina & # 8220; acceso. & # 8221;

Il mio primo consiglio è di non disabilitare il timer di inattività, ovvero solo un hack. Se si desidera mantenere attivo un timer durante gli eventi dell'interfaccia utente, eseguire il timer sul ciclo di esecuzione corrente utilizzando 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];

Ho usato le informazioni su questo post per un piccolo campione che stavo costruendo. Questo è il codice che ho usato quando ho avviato la riproduzione per impedire l'interruzione dell'audio:

AudioSession.Category = AudioSessionCategory.MediaPlayback;

E quando l'applicazione ha terminato la riproduzione per ripristinare il valore originale:

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

L'esempio completo è qui:

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

Di recente ho riscontrato questo problema in un'app su cui sto lavorando che utilizza diversi timer e riproduce alcuni suggerimenti audio e ha apportato due modifiche relativamente semplici:

  1. Nel AppDelegate ho implementato i seguenti metodi e la semplice presenza consente all'app di continuare quando lo schermo è bloccato

    // 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
    {
    }
    

    riferimenti: UIApplicationDelegate Protocol Reference & amp; Riferimento classe NSApplication nell'API doc (accessibile tramite Xcode, basta cercare applicationWillBecomeActive).

  2. Ha reso il viewcontroller principale principale un AVAudioPlayerDelegate e ha usato questo codice di Apple "AddMusic" campione per fare in modo che l'audio riprodotto dall'app riprodotta si integri perfettamente con l'audio dell'iPod, ecc ...

    Ho appena lasciato cadere questo codice in un metodo chiamato durante viewDidLoad. Se questo ti interessa, cadi nella sezione "chi dovrebbe leggere questo documento" categoria per questo: Guida alla programmazione di sessioni 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];
    

Credo che la tua applicazione dovrebbe funzionare normalmente quando sospesa. (pensa a Pandora Radio)

Verifica se il timer è stato allocato a causa della vista nascosta o di altri eventi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top