Como desativar / ativar o modo de suspensão programaticamente no iOS?

162

Eu tenho um aplicativo que deve permanecer acordado até o final de uma contagem regressiva, mas entrará no 'modo de suspensão' sempre que atingir o tempo alocado para dormir.

No meu aplicativo, tenho a opção de adiar o sono, para que os usuários possam desabilitar / habilitar.

Como faço isso programaticamente?

Arnlee Vizcayno
fonte

Respostas:

379

Você pode desativar o timer ocioso da seguinte maneira;

No Objetivo-C:

[UIApplication sharedApplication].idleTimerDisabled = YES;

Em Swift:

UIApplication.sharedApplication().idleTimerDisabled = true

No Swift 3.0 e no Swift 4.0:

UIApplication.shared.isIdleTimerDisabled = true

Coloque de volta em NOoufalse para reativar o modo de suspensão.

Por exemplo, se você precisar até sair da visualização, poderá configurá-la novamente, substituindo a viewWillDisappear:

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

Mais sobre a classe UIApplication .

jrturton
fonte
@Gati Eu duvido, mas não posso confirmar já que eu não tenho um relógio
jrturton
1
@jrturton Hmm .. Não está funcionando no Apple Watch. Se você tiver alguma solução para isso, entre em contato.
IGatiTech 18/06
Obrigado por esta informação. Ele virá a calhar. Eu queria saber se a desativação do modo de suspensão em um aplicativo afetará todo o dispositivo. Por exemplo, se eu desativá-lo no meu aplicativo e sair do aplicativo, ele ainda será desativado após a saída do aplicativo? Preciso verificar se está ativo ou não e depois reativá-lo na saída?
Scott Kilbourn
2
@ScottKilbourn afeta apenas seu aplicativo. [UIApplication sharedApplication]refere-se apenas ao objeto UIApplication do seu aplicativo.
Jrturton 16/09/2015
22

No Swift 3, para desativar o timer ocioso, é agora:

UIApplication.shared.isIdleTimerDisabled = true

Para reativar o timer ocioso, basta:

UIApplication.shared.isIdleTimerDisabled = false

Além disso, observe que YESe NOnão está disponível no Swift e que você deve usá-lo trueou false(em oposição à resposta anterior).

Wyetro
fonte
1

iOS 13, Swift 5,5.1+ para desativar o timer de inatividade. In SceneDelegate.swift.

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

no local exato do Swift 3, onde isso pode ser feito AppDelegate.swift- você deve adicionar UIApplication.shared.isIdleTimerDisabled = truedentro de applicationfunc para que o resultado fique assim:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    UIApplication.shared.isIdleTimerDisabled = true
    return true
}
godblessstrawberry
fonte
2
Isso não depende do AppDelegate. Na verdade, consideraria uma prática ruim manter o dispositivo acordado sem qualquer motivo real. A questão era manter o dispositivo acordado durante uma funcionalidade específica (até o final de uma contagem regressiva). Portanto, desabilitar o timer inativo quando a contagem regressiva começar a terminar, deve ser considerado novamente após o término da contagem.
Martin
@ Cyrus Eu não sou programador rápido. Atualmente, estou criando um aplicativo de visualização na web e tentei muitas soluções sem instruções exatas e que não funcionaram para mim, mas ISSO FUNCIONA. então eu publico isso para compartilhar com outras pessoas que procurarão uma solução semelhante. a razão para usar esse - meu aplicativo é guitarra ajudante que precisa ser sempre despertando durante o jogo
godblessstrawberry