Quelle méthode est appelée après 'applicationDidBecomeActive'?

C'est ma première question ici car j'ai un problème pour développer ma première application iOS. C'est l'une des milliers d'applications de lampe de poche, mais j'essaie de mettre autant de fonctionnalités que possible. L'un d'eux est l'logging de l'état de l'application quand il va à l'arrière-plan ou se termine. Après être passé au premier plan (iOS 4 ou supérieur) ou relancé, je charge les parameters du file et les réapplique. L'un des parameters est, évidemment, le AVCaptureDevice.torchMode . Cependant, je rencontre le problème avec ça. Je réapplique ces parameters dans la méthode applicationDidBecomeActive . Tout semble fonctionner, mais quand j'appuie très rapidement sur le button d'accueil suivi de la relance d'une application, l'application va faire ce qui suit (j'ai retardé la méthode applicationDidBecomeActive pour l'observer):

1. montre l'écran noir (chargement)
2. exécute applicationDidBecomeActive et allume la LED (je mets mon retard ici)
3. montre mon UIViewController actuel et UIViewController au même moment la LED

Cela ne se produit qu'après avoir appelé une application depuis l'arrière-plan juste après son envoi. Je sais que ce n'est pas le scénario d'utilisation réalist, mais j'aime penser que les bogues s'accumulent souvent et qu'en raison de ce mauvais design, je pourrais rencontrer d'autres problèmes à l'avenir. Je suis absolument sûr que ce n'est pas mon code éteindre la LED depuis I NSLog chaque fois que mon code modifie la propriété AVCaptureDevice.torchMode . Donc, pour être exact, ma question est:
Quelle méthode est appelée après applicationDidBecomeActive , éventuellement liée à UIViewController , qui pourrait éteindre ma torche? Et y a-t-il une solution possible ou une solution de rechange?

Selon le guide de programmation d'applications iOS :

Le return au premier plan est l'occasion pour votre application de redémarrer les tâches qu'elle a arrêtées lorsqu'elle est passée en arrière-plan. Les étapes qui se produisent lors du déplacement vers l'avant-plan sont illustrées à la Figure 3-6. La méthode applicationWillEnterForeground: doit annuler tout ce qui a été fait dans votre méthode applicationDidEnterBackground: et la méthode applicationDidBecomeActive: continuer à effectuer les mêmes tâches d'activation qu'au moment du lancement .

Avez-vous essayé de réappliquer vos parameters dans la méthode applicationDidBecomeActive: au lieu de applicationWillEnterForeground: 😕

Une autre chose à considérer est de travailler avec des notifications:

Dans les methods applicationDidBecomeActive: ou applicationDidBecomeActive: de AppDelegate, vous pouvez requestr à votre délégué d'application d'envoyer des notifications à vos controllers:

 - (void)applicationDidBecomeActive:(UIApplication *)application { /* Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. */ // Dispatch notification to controllers [[NSNotificationCenter defaultCenter] postNotificationName: @"didBecomeActive" object: nil userInfo: nil]; } 

Une fois que vous avez ceci, le controller de vue peut s'save pour ces notifications (dans leur méthode init, par exemple) comme ceci:

 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(loadSettings) name: @"didBecomeActive" object: nil]; 

De cette façon, votre controller est conscient que l'application est simplement devenue active et peut exécuter n'importe quelle méthode.

Dans cet exemple, vous loadSettings à votre controller de vue d'exécuter la méthode loadSettings lorsqu'il reçoit la notification didBecomeActive (qui a été publiée par le délégué de l'application).

J'ai seulement une réponse à la question de savoir pourquoi un démarrage rapide de l'application affichera un écran noir, je n'ai aucune reference seulement expérience personnelle et observation.

Lorsque l'application est envoyée à l'arrière-plan, le operating system tente de prendre une capture d'écran à utiliser à la place de Default.png . Si vous démarrez l'application avant la capture d'écran et que vous n'avez pas Default.png dans votre projet, vous l'obtiendrez.

Toujours penser à votre question réelle.