Question

Mon application utilise NSTimer et il semble que NSTimer ne se déclenche pas lorsque l'iPhone passe en mode veille (en appuyant sur le bouton matériel ou par la minuterie inactive).

Lorsque j'active de nouveau l'iPhone, mon application est toujours au premier plan. Qu'advient-il des applications tierces lorsque l'iPhone est en mode veille?

Était-ce utile?

La solution

Bien que ce ne soit pas évident ici, je pense que l'affiche originale a trouvé une réponse à sa question en démarrant un fil de discussion ( disponible ici ) dans les forums de développement pour iPhone (que j'ai finalement dû me trouver car les informations n'y étaient pas partagées).

Si quelqu'un d'autre a la même question et trouve la page dans le futur, voici une réponse utile qui a été postée par quelqu'un sur le forum Apple et intitulé "eskimo1". (que j'ai légèrement modifié de telle sorte qu'il soit plus facile à lire sans le contexte fourni par le fil de discussion original):

  • En ce qui concerne la terminologie relative au statut des applications iPhone, " actif " ne signifie pas "éveillé", mais "attaché à l'interface graphique". Pensez-y comme étant analogue à " frontmost " sous Mac OS X. Lorsque vous verrouillez l'appareil, votre application est désactivée, mais l'appareil peut ou non s'endormir
  • iPhone OS dort rarement si le périphérique est branché sur le secteur (c.-à-d. via USB). Il peut cependant dormir s'il fonctionne sur batterie.
  • Quelques instants après le verrouillage de l'écran (20 secondes selon Oliver Drobnik), l'appareil se met en veille. C'est comme si vous fermiez le couvercle de votre ordinateur portable. toute activité sur la CPU principale s’arrête.
  • Cela ne se produit pas si l'appareil lit l'audio dans la bonne session audio. Voir DTS Q & A QA1626 & Session audio - Assurer la lecture audio en continu lorsque l'écran est verrouillé " pour plus de détails.
  • Notez que la propriété idleTimerDisabled (qui peut être activée pour empêcher l'écran de s'éteindre pendant l'exécution de l'application) concerne le verrouillage de l'écran après une inactivité de l'utilisateur. Ce n'est pas directement lié au sommeil du système (c'est indirectement lié au fait que le système peut dormir peu de temps après son verrouillage).

Autres conseils

Voir Interruptions d'application dans le Guide de programmation pour iPhone OS , en particulier les événements applicationWillResignActive et applicationDidBecomeActive . (Tout le guide vaut certainement la peine d'être lu.) Lorsque vous ignorez les événements, le chronomètre semble s'allumer pendant un moment, puis s'arrête. Cela semble logique, l'application pourrait facilement vider la batterie si elle continue à fonctionner. Et qu'arrive-t-il à l'application? Je suppose qu’il n’obtient tout simplement pas de temps CPU & # 8211; il gèle et ne fond que lorsque vous rallumez la machine. & # 8221;

Mon premier conseil est de ne pas désactiver le minuteur inactif, c’est juste un bidouillage. Si vous souhaitez conserver une minuterie en vie pendant les événements d'interface utilisateur, exécutez-la sur la boucle d'exécution actuelle à l'aide de 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];

J'ai utilisé les informations sur ce message pour un petit échantillon que je construisais. C'est le code que j'ai utilisé lorsque j'ai lancé la lecture pour empêcher le son de s'arrêter:

AudioSession.Category = AudioSessionCategory.MediaPlayback;

Et lorsque l'application est terminée avec la lecture pour rétablir la valeur d'origine:

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

L'échantillon complet est ici:

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

J'ai récemment été confronté à ce problème dans une application sur laquelle je travaille, qui utilise plusieurs minuteries, diffuse des invites audio et apporte deux modifications relativement simples:

  1. Dans AppDelegate , j'ai implémenté les méthodes suivantes et la seule présence permet à l'application de continuer lorsque l'écran est verrouillé

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

    références: UIApplicationDelegate Protocol Reference & amp; Référence de la classe NSApplication dans l'API doc (accessible via Xcode, il suffit de rechercher applicationWillBecomeActive ).

  2. Définition de la classe principale viewcontroller en AVAudioPlayerDelegate et utilisation de ce code à partir du code "AddMusic & Apple" d'Apple. échantillon pour que les alertes audio lues par l’application soient bien mélangées à l’audio de l’iPod, etc.

    Je viens de déposer ce code dans une méthode appelée lors de viewDidLoad. Si cela vous intéresse, vous tombez dans le "qui devrait lire ce document" catégorie pour cela: Guide de programmation de session 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];
    

Je pense que votre application devrait fonctionner normalement lorsqu'elle est suspendue. (pensez à Pandora Radio)

Vérifiez si votre minuterie est désallouée en raison du masquage de votre vue ou de la survenue d'un autre événement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top