iPhone: NSTimer im Standby
Von Manfred Kreß
Seite 1 von 1
In einer App, welche Daten verschlüsselt auf dem iPhone speichert, sollte der Bildschirm nach einer bestimmten Zeit der Inaktivität gesperrt werden. UIApplication überschrieben, die Events abgefangen und bei jedem Event den Timer wieder hochgesetzt. Soweit einfach. Allerdings gab es einen kleinen Haken!
Hat sich die das iPhone in den Ruhezustand begeben, wurde der Timer hinterher nicht gefeuert. Im Fall dieser App eine echte Sicherheitslücke. Das Problem lässt sich allerdings einfach lösen. Zumindest, wenn man die Lösung einmal gefunden hat.
Ich habe zuerst einen "scheduled timer" verwendet, wie man das wohl aus Bequemlichkeit meistens macht:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: interval
target: self
selector: @selector(mySelector)
userInfo: nil
repeats: NO];
Wie gesagt, der wurde nach dem Ruhezustand nie gefeuert.
Übergibt man allerdings den Timer "von Hand" an die RunLoop klappts:
NSTimer *timer = [NSTimer timerWithTimeInterval: interval
target: self
selector: @selector(mySelector)
userInfo: nil
repeats: NO];
[[NSRunLoop currentRunLoop] addTimer: timer
forMode: NSDefaultRunLoopMode];
Der Timer wird gefeuert, auch wenn die App zwischenzeitlich im Ruhezustand war, oder der Timer während des Standby hätte feuern sollen.
Allerdings "eiert" er dann ein wenig. Das heisst, er feuert nicht mehr präzise.
Warum das nun so ist: Keine Ahnung! Eigentlich wird der scheduled Timer auch im DefaultRunLoopMode abgearbeitet. Das sollte theoretisch keinen Unterschied machen. Theoretisch!
(iPhone OS 3.1.x)Seite: 1 von 1
1
iPhone: NSTimer im Standby

