11 Stimmen

Erkennen, ob der iPhone-Bildschirm an/aus ist

Gibt es eine Möglichkeit zu erkennen, ob der Bildschirm eines iPhones ein- oder ausgeschaltet ist? Zum Beispiel, wenn die Taste für die Bildschirmsperre des Telefons gedrückt wird.

Ich habe mit (void)applicationWillResignActive:(UIApplication *)application; um sich auf solche Ereignisse vorzubereiten (was in den meisten Fällen gut funktioniert), aber diese Methode wird auch bei eingehenden Anrufen, Texten usw. ausgelöst.

Soweit ich weiß, gibt es keine dokumentierte Methode, um dies festzustellen.

Ich habe mit einigen Workarounds gespielt, wie z. B. der Überprüfung, ob sich die Bildschirmauflösung geändert hat, der Überprüfung, ob die Ausrichtung unbekannt ist, oder der Ermittlung der Helligkeit des Geräts. Nichts hat sich bisher als richtig herausgestellt.

Hat jemand eine kreative Lösung für dieses Problem?

9voto

Deepak Danduprolu Punkte 44474

Ja, es gibt keine endgültige Methode. UIApplication hat eine Eigenschaft protectedDataAvailable die Folgendes zurückgeben wird YES wenn der Bildschirm entriegelt ist und NO wenn gesperrt nur, wenn der Benutzer den Inhaltsschutz aktiviert . Das ist also das Naheliegendste, aber unzuverlässigste, was mir einfällt. In einem solchen Fall können Sie sogar zuhören UIApplicationProtectedDataDidBecomeAvailable y UIApplicationProtectedDataWillBecomeUnavailable Benachrichtigungen.

2voto

Nate Punkte 30799

Sie können verwenden Darwin-Meldungen um auf die Ereignisse zu achten. Ich bin nicht 100 % sicher, aber es sieht für mich, von der Ausführung auf einem jailbroken iOS 5.0.1 iPhone 4, dass eines dieser Ereignisse sein könnte, was Sie brauchen:

com.apple.iokit.hid.displayStatus
com.apple.springboard.hasBlankedScreen
com.apple.springboard.lockstate

Anmerkung: laut dem Poster Kommentare zu einer ähnlichen Frage, die ich hier beantwortet habe Dies sollte auch auf einem nicht verhafteten Telefon funktionieren.

Melden Sie sich wie folgt für die Veranstaltung an (damit melden Sie sich nur für eine Veranstaltung an, aber wenn das bei Ihnen nicht funktioniert, probieren Sie die beiden anderen aus):

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
                                NULL, // observer
                                displayStatusChanged, // callback
                                CFSTR("com.apple.iokit.hid.displayStatus"), // event name
                                NULL, // object
                                CFNotificationSuspensionBehaviorDeliverImmediately);

donde displayStatusChanged ist Ihr Ereignis-Callback:

static void displayStatusChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
    NSLog(@"event received!");
    // you might try inspecting the `userInfo` dictionary, to see 
    //  if it contains any useful info
    if (userInfo != nil) {
        CFShow(userInfo);
    }
}

Ich glaube, dass die oben aufgeführten Ereignisse ausgelöst werden, wenn der Bildschirm sowohl eingeschaltet ist et aus, verriegelt und entriegelt. Möglicherweise müssen Sie den Zustand selbst feststellen. Auch,

com.apple.springboard.lockcomplete

wird nur aufgerufen, wenn der Bildschirm gesperrt wird, nicht wenn er entsperrt wird.

1voto

Alex Punkte 899

Versuchen Sie este Abhilfe. Der Autor behauptet, dass es gut auf 4.2 funktioniert

Ich habe es unter iOS 3.1 (iPhone 3G) getestet - es funktioniert gut.

Update: Funktioniert nicht auf iOS 5 beta 7 (iPod Touch 4G) :-(

update2: Die App geht in den Hintergrund, wenn der Bildschirm gesperrt ist, daher funktioniert die Lösung irgendwie unter iOS 5 beta 7 :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X