본문 바로가기

ISSUE

[ISSUE] 저전력 모드 화면 꺼짐 방지

현재 프로젝트에서 3분에서 5분 사이의

Audio 파일이 재생되는 ViewController가 있었다.

 

그리고 그 VC는

Audio의 재생이 끝날때까지 

특정 animation을 동작하는 프로세스를 가지고 있어

무엇보다 시청각이 주 컨텐츠인 VC였다.

 

하지만 사용자가 디바이스의 설정에서

저전력 모드를 활성화 했을때

일정 시간이 지나면 앱의 화면이 잠겨 버리는 issue가 발생했다.

 

해당 VC만큼은 저전력 모드 활성화로 인한 

화면 자동 잠금이 이루어지지 않아야 한다는 요청이 있었다.

 

그리하여 idleTimerDisabled이라는 Bool 타입의 속성을 컨트롤하여

issue를 해결했고 그 과정을 포스팅하겠다.

 

일단 Apple 공식 문서의 설명을 참고하자면

 

 

idleTimerDisabled이라는 속성의 기본값은 false다. 

대부분의 앱이 짧은 기간 동안 사용자 입력으로 터치하지 않으면

시스템은 기기를 화면이 어두워지는 '절전'상태로 전환한다.

이는 전원을 절약하기 위해 수행된다.

하지만 사용자 입력이없는 앱은 가속도계를 제외하고 (예 : 게임)이

속성을 true로 설정하면 "유휴 타이머"를 비활성화하여 시스템 절전을 방지 할 수 있다.

 

라고 한다.

 

즉 절전 상태로 전환하는데에 있어 필요한 

사용자의 무 입력 시간을 카운팅 하는 

Timer를 비활성화하여

저전력 모드 활성화로 인한 화면잠금을

실행 시키지 않게 할 수 있다.

 

 

UIAplication의 싱글톤 객체로 접근하여 설정

UIApplication.shared.isIdleTimerDisabled = true

 

하지만 이렇게 true만 설정을 해놓는다면

다른 VC에서도 절전모드의 효력이 없어저

사용자의 시스템 환경을 고려하지 못하는 앱이 되어버리는 수가 있다.

 

그리하여 해당 VC에서만 

Timer의 비활성화 설정을 하기위해

 

아래와 같이 VC의 View가 load 되고 한번만 비활성화가 되게끔 설정해주었다가

VC의 인스턴스가 메모리에서 해제되기 직전 상태인 deinit 메소드에

다시 Timer를 활성화 해주게 코드를 작성해 놓았다.

 

override func viewDidLoad() {
    super.viewDidLoad()
    UIApplication.shared.isIdleTimerDisabled = true
}
.
.
.
deinit {
    UIApplication.shared.isIdleTimerDisabled = false
}

 

최종적으로 다른 VC에서는 저전력 모드 활성화로 인한

화면 자동 잠기 기능이 정상적으로 실행되는걸 볼 수 있을것이다.