Wie kann ich den Schlafmodus unter iOS programmgesteuert deaktivieren / aktivieren?

162

Ich habe eine App, die bis zum Ende eines Countdowns wach bleiben muss, aber immer dann in den Schlafmodus wechselt, wenn die zugewiesene Schlafzeit erreicht ist.

In meiner App habe ich die Möglichkeit, den Ruhezustand zu verschieben, damit Benutzer ihn deaktivieren / aktivieren können.

Wie mache ich das programmgesteuert?

Arnlee Vizcayno
quelle

Antworten:

379

Sie können den Leerlauf-Timer wie folgt deaktivieren:

In Ziel-C:

[UIApplication sharedApplication].idleTimerDisabled = YES;

In Swift:

UIApplication.sharedApplication().idleTimerDisabled = true

In Swift 3.0 und Swift 4.0:

UIApplication.shared.isIdleTimerDisabled = true

Stellen Sie den Ruhemodus wieder ein NOoder falsewieder ein.

Wenn Sie es beispielsweise benötigen, bis Sie die Ansicht verlassen, können Sie es zurücksetzen, indem Sie viewWillDisappear überschreiben:

override func viewWillDisappear(_ animated: Bool) {
    UIApplication.shared.isIdleTimerDisabled = false
}

Weitere Informationen zur UIApplication-Klasse .

jrturton
quelle
@Gati Ich bezweifle es, aber ich kann nicht bestätigen, da ich keine Uhr habe
jrturton
1
@ jrturton Hmm .. Es funktioniert nicht in Apple Watch. Wenn Sie eine Lösung dafür haben, lassen Sie es mich bitte wissen.
iGatiTech
Danke für diese Information. Es wird nützlich sein. Ich habe mich gefragt, ob das Deaktivieren des Ruhemodus in einer App das gesamte Gerät betrifft. Wenn ich es in meiner App deaktiviere und dann die App beende, wird es nach dem Beenden der App weiterhin deaktiviert? Muss ich überprüfen, ob es aktiv ist oder nicht, und es dann auf dem Weg nach draußen wieder aktivieren?
Scott Kilbourn
2
@ScottKilbourn betrifft nur Ihre App. [UIApplication sharedApplication]bezieht sich nur auf das UIApplication-Objekt Ihrer App.
Jrturton
22

In Swift 3 können Sie den Leerlauf-Timer jetzt deaktivieren:

UIApplication.shared.isIdleTimerDisabled = true

Um den Leerlauf-Timer wieder einzuschalten, gehen Sie einfach wie folgt vor:

UIApplication.shared.isIdleTimerDisabled = false

Beachten Sie außerdem, dass YESund NOin Swift nicht verfügbar sind und dass Sie entweder trueoder false(im Gegensatz zur vorherigen Antwort) verwenden müssen.

Wyetro
quelle
1

iOS 13, Swift 5,5.1+ zum Deaktivieren des Leerlauf-Timers. In SceneDelegate.swift.

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
     UIApplication.shared.isIdleTimerDisabled = true
 }
Sandeep Maurya
quelle
-5

In Swift 3 ist der genaue Ort, an dem dies möglich ist, AppDelegate.swift- Sie sollten UIApplication.shared.isIdleTimerDisabled = truein applicationfunc hinzufügen, damit das Ergebnis folgendermaßen aussieht:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    UIApplication.shared.isIdleTimerDisabled = true
    return true
}
Godblessstrawberry
quelle
2
Dies ist nicht abhängig von AppDelegate. Tatsächlich würde ich es als schlechte Praxis betrachten, das Gerät ohne wirklichen Grund wach zu halten. Die Frage war, das Gerät während einer bestimmten Funktionalität (bis zum Ende eines Countdowns) wach zu halten. Daher sollte in Betracht gezogen werden, den Leerlauf-Timer zu deaktivieren, wenn der Countdown beginnt und nach dem Ende des Countdowns wieder aktiviert wird.
Martin
@ Cyrus Ich bin kein schneller Programmierer. Derzeit mache ich eine Webview-App und habe viele Lösungen ohne genaue Anweisungen ausprobiert. Das hat bei mir nicht funktioniert, aber DAS FUNKTIONIERT. Deshalb poste ich dies, um es mit anderen zu teilen, die nach einer ähnlichen Lösung suchen. Der Grund für die Verwendung dieser - meine App ist Gitarrenhelfer, der während des Spielens immer wach sein muss
godblessstrawberry