2010-03-07 11 views
0

J'ai créé une application qui utilise NSTimer, qui est déclenchée chaque seconde.L'application Iphone est retardée de 10 à 15 minutes lorsque l'iPhone est en mode veille

Mon problème est que si l'Iphone est en mode veille, je reçois un délai de 10 à 15 minutes avant le déclenchement de l'événement. J'ai stackoverflowed et googled ce et la raison pour cela semble être que le téléphone arrête d'écouter certains événements en mode veille.

Certaines personnes ont résolu ce problème en jouant un son muet, ne permettant pas au téléphone de dormir.

  1. Quelle pourrait être la raison du retard?
  2. La solution sonore muette semble être très "sale". Y a-t-il un autre moyen de résoudre ce problème?
  3. Si j'utilise la solution sonore muette, cela passera-t-il l'examen des pommes?

code:

timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(goAction)userInfo:nil repeats:YES]; 

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

-(void)goAction { 
    // Here i check for some dates and then call the activateBeepAlarmView 
} 

Répondre

2

Eh bien, puisque personne n'a répondu à mes trois questions que je vais devoir y répondre:

1. Quelle pourrait être la raison de ce retard? Je vais devoir citer Ben S:

Une fois applicationWillResignActive est appelée sur votre application, vous arrêtez simplement la réception d'événements: Le délégué peut mettre en œuvre cette méthode pour faire des ajustements lorsque les transitions d'application d'un état actif à un état inactif . Lorsqu'une application est inactive, elle s'exécute mais ne distribue pas les événements entrants. Cela se produit lorsqu'une fenêtre de superposition apparaît ou lorsque le périphérique est verrouillé.

Le mode veille est d'économiser de l'énergie. Pour ce faire, l'appareil arrête d'écouter des événements comme ceux que vous demandez. Les événements NSTimer continueront à se déclencher car ils ne nécessitent pas de surveillance matérielle coûteuse (par rapport à la batterie). De plus, les alarmes sont implémentées à l'aide de NSTimer, elles doivent donc pouvoir fonctionner même en mode veille. Sinon, les gens pourraient ne pas se réveiller et blâmer leur iPhone.

2. La solution sonore muette semble être très "sale". Y a-t-il un autre moyen de résoudre ce problème?
Non, actuellement je n'ai pas trouvé une autre solution, n'hésitez pas à me corriger si je me trompe. Découvrez this blog comment le faire.

3. Si j'utilise la solution de son muet, cela passera-t-il l'examen de la pomme? Oui

0

Qu'est-ce qui se passe dans votre application lorsque le NSTimer est déclenché chaque seconde? Veuillez fournir le code indiquant la création de la minuterie ainsi que le code du sélecteur appelé lorsque la minuterie est terminée.

Aussi, que voulez-vous dire par un "délai de 10 à 15 minutes"? Est-ce que le délai est toujours aussi long ou est-ce que c'est combien de temps vous attendez pour réveiller l'iPhone et que l'événement est déclenché? En fonction de ce que vous devez faire chaque seconde, vous pouvez gérer cette situation de différentes manières. S'il vous plaît répondez et nous essayerons de travailler notre chemin à travers cela.

Bart

+0

Par délai, je veux dire que la fonction activateBeepAlarmView est appelée et que le téléphone commence à émettre un bip sans que j'appuie sur le bouton d'alimentation pour le sortir du mode veille/verrouillage. Si j'appuie sur le bouton d'alimentation, l'application se réveille et émet un bip. – jakob

1

Lorsque l'iPhone va dormir, alors que votre application et le runloop qui exécute le NSTimer.

Vous semblez penser qu'un NSTimer est une sorte de minuterie basée sur le matériel. Ce n'est pas. Il fonctionne complètement dans le logiciel de l'application qui le lance. Je ne sais pas ce qui réveille votre application mais ce n'est certainement pas le NSTimer.

En bref, ce que vous voulez faire est impossible. Vous ne pouvez pas dormir le téléphone, puis avoir une application toujours active et en cours d'exécution. La technique du son muet est juste un gadget pour garder le téléphone éveillé et l'application en cours d'exécution.

Si vous avez besoin que le téléphone reste éveillé, vous devez définir la valeur idleTimerDisabled de l'application sur YES. Cela empêchera le téléphone de dormir et l'application peut rester active. Mais une fois que vous avez laissé le téléphone dormir, il ne peut pas être réveillé du code de l'application. Seul le matériel peut le faire en réponse à une alarme ou à un message entrant.

+0

Est-ce que cela signifie que chaque application qui fonctionne lorsque l'utilisateur a utilisé le bouton d'alimentation pour le mode de verrouillage, doit utiliser une sorte de piratage pour ne pas aller dormir? E.g Alaram Clock Pro? – jakob

+0

Pour autant que je sache. Je ne pense pas que Alarm Clock Pro fonctionne si vous éteignez l'appareil. Certainement, ils n'annoncent pas que c'est le cas. Une règle de base de la conception de l'iPhone est que les applications non-Apple ne peuvent pas remplacer le matériel. Pensez à tous les problèmes que les applications pourraient rencontrer si elles pouvaient réveiller l'appareil lorsque personne ne le regardait ou, pire, l'éteindre. Vous pourriez être en mesure de faire quelque chose avec les routines BSD de bas niveau, mais j'en doute sérieusement. – TechZen

+0

Salut encore, merci pour votre réponse mais je ne pense pas que nous nous comprenons vraiment. Je ne parle pas de la fermeture de l'appareil, mais de verrouiller l'écran avec le bouton d'alimentation, ce qui entraînera l'iPhone en mode veille (corrigez-moi si je me trompe). – jakob

0

@Jakob,

Ceci est impossible avec le "SDK officiel". Si vous développez des applications pour téléphone cassé en prison, vous pouvez utiliser le framework IOKit pour cela. Pour plus d'informations s'il vous plaît se référer this.