24 Stimmen

Was passiert mit einer iPhone-App, wenn das iPhone in den Standby-Modus geht?

Meine App verwendet NSTimer und es scheint, dass NSTimer nicht ausgelöst wird, wenn das iPhone in den Standby-Modus wechselt (entweder durch Drücken der Hardware-Taste oder durch den Ruhezustand).

Wenn ich das iPhone wieder aktiviere, ist meine App immer noch im Vordergrund. Was passiert mit Drittanbieter-Apps, wenn das iPhone im Standby-Modus ist?

46voto

Clint Harris Punkte 14264

Auch wenn es hier nicht offensichtlich ist, glaube ich, dass der Ursprungsposter eine Antwort auf seine Frage gefunden hat, indem er einen Thread im iPhone Developer Forum gestartet hat (hier verfügbar), den ich letztendlich selbst finden musste, weil die Informationen hier nicht geteilt wurden.

Falls jemand anderes die gleiche Frage hat und die Seite in Zukunft findet, hier ist eine hilfreiche Antwort, die von jemandem im Apple-Forum namens "eskimo1" gepostet wurde (die ich etwas bearbeitet habe, damit sie einfacher zu lesen ist, ohne den vollständigen Original-Thread zu kennen):

  • Was die Terminologie des iPhone-App-Status betrifft, bedeutet "aktiv" nicht "wach", sondern "angeschlossen an die GUI". Stell es dir so vor, wie "vorderste" in Mac OS X. Wenn du das Gerät sperrst, deaktiviert sich deine App, aber das Gerät geht eventuell nicht in den Ruhezustand.
  • Das iPhone-Betriebssystem schläft selten, wenn das Gerät mit Hauptstrom verbunden ist (d.h. über USB). Es kann jedoch schlafen, wenn es über Akku läuft.
  • Kurz nachdem der Bildschirm gesperrt ist (nach 20 Sekunden laut Oliver Drobnik) schläft das Gerät. Das ist so, als ob du den Deckel deines Laptops schließt; alle Aktivitäten auf der Haupt-CPU stoppen.
  • Dies passiert nicht, wenn das Gerät Audio in der richtigen Audio-Session abspielt. Siehe DTS Q&A QA1626 "Audio Session - Ensuring audio playback continues when screen is locked" für Details.
  • Beachte, dass die idleTimerDisabled-Eigenschaft (die aktiviert werden kann, um zu verhindern, dass der Bildschirm ausgeht, während die App läuft) sich darauf bezieht, den Bildschirm nach Inaktivität des Benutzers zu sperren. Es ist nicht direkt mit dem System-Schlaf verbunden (indirekt jedoch, da das System kurz nach dem Sperren möglicherweise schlafen geht).

14voto

zoul Punkte 99332

Siehe Unterbrechungen der Anwendung im iPhone OS Programmierhandbuch, insbesondere die Ereignisse applicationWillResignActive und applicationDidBecomeActive. (Das gesamte Handbuch ist definitiv lesenswert.) Wenn Sie die Ereignisse ignorieren, läuft der Timer scheinbar weiter und stoppt dann. Klingt logisch, die Anwendung könnte leicht die Batterie entladen, wenn sie weiter läuft. Und was passiert genau mit der Anwendung? Ich denke, sie erhält einfach keine CPU-Zeit - sie friert ein und tau t nur auf, wenn Sie das Gerät wieder "einschalten".

3voto

Amber Star Punkte 364

Mein erster Rat ist, den Leerlauf-Timer nicht zu deaktivieren, das ist nur ein Hack. Wenn Sie einen Timer während UI-Ereignissen am Leben erhalten möchten, führen Sie den Timer im aktuellen Laufzeitdurchlauf unter Verwendung von NSCommonModes aus:

// Timer erstellen und ihn zum aktuellen Laufzeitdurchlauf unter Verwendung von Common Modes hinzufügen

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

1voto

echobravo Punkte 393

Ich wurde kürzlich in einer App, an der ich arbeite, mit diesem Problem konfrontiert, das mehrere Timer verwendet und einige Audio-Hinweise wiedergibt, und ich habe zwei relativ einfache Änderungen vorgenommen:

  1. In der AppDelegate habe ich die folgenden Methoden implementiert, und allein das Vorhandensein ermöglicht es der App, fortzufahren, wenn der Bildschirm gesperrt ist

    // Diese Methode empfängt die Benachrichtigung, wenn das Gerät gesperrt ist
    - (void)applicationWillResignActive:(UIApplication *)application
    { 
    }
    
    // Diese Methode empfängt die Benachrichtigung, dass die Anwendung bald wieder aktiv wird
    - (void)applicationWillBecomeActive:(NSNotification *)aNotification
    {
    }

    Referenzen: UIApplicationDelegate Protocol Reference & NSApplication Class Reference in der API-Dokumentation (über Xcode zugänglich, suchen Sie einfach nach applicationWillBecomeActive).

  2. Ich habe die Hauptklasse des viewcontrollers zu einem AVAudioPlayerDelegate gemacht und diesen Code aus Apples Beispiel "AddMusic" verwendet, um die Audio-Hinweise der App schön mit der iPod-Audio usw. zu mischen...

    Ich habe diesen Code einfach in eine Methode fallen lassen, die während des viewDidLoad aufgerufen wird. Wenn dies Ihr Interesse weckt, gehören Sie zur Kategorie "wer dieses Dokument lesen sollte" für dieses: Audio Session Programming Guide

    // Registriert diese Klasse als Delegierter der Audio-Session.
    [[AVAudioSession sharedInstance] setDelegate: self];
    
    // Die AmbientSound-Kategorie ermöglicht es der Anwendungs-Audio, sich mit dem Media Player-Audio zu vermischen. Die Kategorie gibt auch an, dass die Anwendungs-Audio-Wiedergabe gestoppt werden soll, wenn der Klingel-/Stummumschalter auf "Stumm" gestellt ist oder der Bildschirm gesperrt ist.
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
    
    // Aktiviert die Audio-Session.
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];

1voto

miguel.de.icaza Punkte 32614

Ich habe die Informationen in diesem Beitrag für ein kleines Muster verwendet, das ich erstellt habe. Hier ist der Code, den ich verwendet habe, als ich die Wiedergabe gestartet habe, um zu verhindern, dass der Ton stoppt:

AudioSession.Category = AudioSessionCategory.MediaPlayback;

Und wenn die Anwendung mit der Wiedergabe fertig ist, um auf den Originalwert zurückzusetzen:

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

Das vollständige Muster ist hier:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X