2009-06-21 15 views
5

Ich habe derzeit eine sehr einfache App, für die die einzige Interaktion das iPhone schütteln wird. Aber schließlich wird der Bildschirm abgedunkelt und automatisch gesperrt, da das iPhone keine Berührungsereignisse erhält. Ich habe mich gefragt, ob es eine Möglichkeit gibt, das automatische Sperr-Timeout zurückzusetzen, wenn es geschüttelt wird?Verzögern, aber nicht deaktivieren iPhone Auto-Sperre

Ich weiß, dass die automatische Sperre deaktivieren vollständig das ich tun würde:

[[ UIApplication sharedApplication ] setIdleTimerDisabled: YES ] 

aber ich will nicht wirklich vollständig deaktivieren; Wenn das iPhone nicht verwendet wird, sollte es wie erwartet automatisch gesperrt werden.

Danke für Ihre Hilfe.

+2

Ich dachte, Baby-Shake wurde verboten. –

Antwort

11

Sie können den Wert [UIApplication sharedApplication].idleTimerDisabled basierend auf dem Wert Ihrer eigenen NSTimer- oder Verhaltensgeste (Schütteln des Telefons) umschalten. Es kann in Ihrer Anwendung mehrfach auf YES/NO eingestellt werden.

+0

OK, ich werde es versuchen. Ich dachte, es könnte nur eine resetIdleTimer-Methode oder etwas sauberer sein. –

6

Hier ist der Code, den ich in meiner App verwende. Ein bisschen Hintergrund: Meine App hat einen eingebauten Webserver, so dass Benutzer über WIFI auf Daten von einem Browser zugreifen können und jedes Mal, wenn eine Anfrage auf dem Server ankommt, verlängere ich den Sperrtimer (in diesem Fall für mindestens 2 Minuten; Sie erhalten immer noch die Standardzeit, die nach der erneuten Aktivierung hinzugefügt wird.

// disable idle timer for a fixed amount of time. 
- (void) extendIdleTimerTimeout 
{ 
    // cancel previous scheduled messages to turn idle timer back on 
    [NSObject cancelPreviousPerformRequestsWithTarget:self 
     selector:@selector(reenableIdleTimer) 
     object:nil]; 
    // disable idle timer 
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; 

    // re-enable the timer on after specified delay. 
    [self performSelector:@selector(reenableIdleTimer) withObject:nil afterDelay: 60 * 2]; 

} 

- (void) reenableIdleTimer 
{ 
sharedApplication].idleTimerDisabled); 
    [NSObject cancelPreviousPerformRequestsWithTarget:self 
     selector:@selector(reenableIdleTimer) 
     object:nil]; 
    // disable idle timer 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
} 
+0

Dieser Code ist sehr nützlich, wir haben ihn direkt in unsere App gelegt, danke! Nur zur Information, meine Tests mit einem iPad 2 mit iOS 5.0.1 scheinen darauf hinzudeuten, dass die festgelegte Zeitmenge tatsächlich die minimale Leerlaufzeit ist - d. Wenn die konfigurierte Sperrverzögerung des Benutzers geringer ist, wird der Bildschirm auch unmittelbar nach dem setDileTimerDisabled: NO-Aufruf gesperrt. Wenn die Sperrzeit des Benutzers länger als die festgelegte Zeit ist, hat der obige Code keine Auswirkung. – JosephH

+0

Mein Code ist vor iOS4, also ist es gut, dass Sie Ihre Beobachtungen zu den neueren Versionen von iOS zur Verfügung gestellt haben. – wkw