티스토리 뷰
앱은 하루 동안 다양한 중요 기능을 제공하기 때문에 사람들의 삶을 풍요롭게 합니다. 그러나 앱 사용에는 배터리 소모라는 비용이 따라옵니다. 따라서 사용자가 장치와 앱을 더 오래 사용할 수 있도록 앱의 배터리 수명을 개선하는 데 각별히 주의하는 것이 중요합니다. 이번 글에서는 WWDC 2022 - Power Down: Improve Battery Consumption 영상을 통해 어떻게 하면 개발자가 앱 사용시 배터리 수명을 개선할 수 있는지 살펴보겠습니다.
크게 4가지를 할 수 있습니다.
- 다크모드 지원
- 프레임(주사율) 검사
- 백그라운드 시간 지연
- 앱 작동 지연
1. 다크 모드
아이폰의 액정은 OLED를 사용합니다. OLED에서는 어두운 콘텐츠가 밝은 콘텐츠보다 적은 전력을 소비합니다. OLED는 픽셀 단위로 전력을 소비합니다.
배터리 소비의 주 원인은 보통 디스플레이입니다. 다크모드를 적용함으로써 배터리 소비를 줄일 수 있고, 다크 모드에서 라이트 모드 대비 최대 70%까지 절약이 가능합니다!
Xcode에서 동적 컬러를 설정함으로서 아주 쉽게 다크모드를 설정해줄 수 있습니다. 더 자세한 내용은 WWDC 2019 - Implementing Dark Mode on iOS 를 참고하세요.
앱에서 다크모드를 적용했으면 앱의 웹 콘텐츠에도 다크 모드를 적용하면 좋습니다. WebKit을 통해 color-shceme을 적용하면 됩니다. 웹페이지의 기본 텍스트와 배경색을 현재 시스템과 맞출 수 있습니다.
WebKit에 다크모드를 적용하는 더 자세한 내용은 WWDC 2019 - Supporting Dark Mode in Your Web Content에서 확인할 수 있습니다.
2. 프레임(주사율) 검사
프레임(주사율)은 1초당 화면에 갱신되는 횟수입니다.
높은 프레임 = 높은 전력 소비
아이폰은 Pro Motion 디스플레이를 사용해서 프레임이 가장 높은 애니메이션에 의해 프레임이 결정됩니다. 따라서 모든 프레임이 높을 필요가 없습니다. 동적인 디스플레이를 사용함으로 개발자는 프레임 관리를 해줘야합니다.
위 예시에서 트럭은 30fps이지만, 그 아래 Food Truck 텍스트는 60fps입니다. 이렇게 되면 가장 높은 프레임에 의해 하면 전체가 60fps가 됩니다.
이 경우 Food Truck 텍스트를 30fps로 줄여 화면의 프레임은 30fps로 줄일 수 있고, 배터리 소모를 최대 20% 줄일 수 있습니다.
분석 도구인 Instruments의 CoreAnimation FPS 도구를 사용해 앱의 시간별 프레임률을 알 수 있습니다.
.
.
CoreAnimation의 CADisplayLink를 사용하여 커스텀 애니메이션과 렌더링을 반복하고 싶을 때가 있습니다. CADisplayLink는 프레임과 동기화된 타이머입니다. 앱은 CADisplayLink에 최소, 최대, 선호 프레임 정보를 지정합니다.
DisplayLink가 시스템(iOS, macOS 등)에서 감당할 수 있는 수준을 파악하여 선호 프레임에 근접한 프레임을 선택합니다. 선호 프레임을 맞출 수 없으면 지정 범위 안에서 프레임을 선택하려고 시도합니다.
// Create a display link
func createDisplayLink() {
let displayLink = CADisplayLink(target: self,selector: #selector(step))
// Configure your desired refresh rate by calling preferredFrameRateRange
displayLink
.preferredFrameRateRange = CAFrameRateRange(minimum: 10,maximum: 60,preferred: 30)
// then activate your CADisplayLink by adding it to the main runloop.
displayLink.add(to: .current, forMode: .defaultRunLoopMode)
}
displayLink가 초기화되면 CAFrameRateRange를 사용해 선호 프레임률 범위를 정할 수 있습니다. 코드에서 선호(preferred) 프레임이 30이지만 10~60 프레임을 커버합니다.
기본적으로 선호 프레임인 30fps에 근접한 프레임으로 애니메이션을 보여주고, 상황에 따라 10~60fps로 알아서 설정해줍니다. 배터릴 절약모드와 같이 배터리 소비를 줄이면 프레임이 더 줄어들겠죠??
주사율과 관련된 내용은 WWDC 21 - Optimize for variable refresh rate displays에서 추가적으로 확인할 수 있습니다.
3. 백그라운드 시간 지연
사용자가 내 앱에서 다른 앱으로 이동하면 백그라운드 API가 실행됩니다. 위치, 오디오 등을 사용하면 배터리 소모가 빨라짐으로 항상 주의해서 사용해야 합니다.
실제 앱으로 생각해보면 음악 앱이나 유튜브 앱을 종료해도 계속해서 소리를 들을 수 있습니다. 지도 앱과 같이 위치 정보를 사용하는 앱을 종료해도 위치 정보를 계속 수집합니다. 배터리 소비를 줄이기 위해서 필요할 때만 위치 정보와 오디오를 사용하는 것이 중요합니다!
위치
백그라운드에서 실행되는 위치 정보(location session) 런타임에 관해 파악하는 것이 중요합니다. 위치 정보가 더 이상 필요하지 않을 때 stopUpdationLocation()을 호출해야 합니다.
XCode Gauges
XCode Gauges를 사용해 시스템 에너지 사용량을 알 수 있습니다. 백그라운드 위치 수집에 따른 배터리 사용량도 알 수 있습니다.
MetricKit
앱 출시전에 MetricKit을 이용해서 일일 사용 진단 정보를 수집할 수 있습니다. cumulativeBackgroundLocationTime 프로퍼티를 사용해 확인할 수 있습니다.
Control Center (iOS 16.0 이상부터)
iOS 16.0부터 제어센터에서 현재 위치 정보를 사용 중인 앱 확인 가능합니다. 원치(예상치) 않는 시간에 내 앱이 실행 중인지 확인해서 런타임을 설정해줍니다.
오디오
오디오 세션에도 똑같이 적용 가능합니다.
사용자가 음악을 듣다가 정지하면 오디오 엔진도 일시 정지하거나 멈춰야 합니다. 이 때 AVAudioEngine의 autoShutdownEnabled 프로퍼티를 사용합니다.
오디오 엔진은 특정 시간 이상 대기(idle) 상태라면, 자동으로 오디오 하드웨어를 중단합니다. 나중에 다른 소스가 활성화되면 동적으로 오디오 하드웨어를 시작합니다.
4. 앱 작동 지연
콘텐츠 화면 렌더링, 오디오&영상 재생 등의 특정 작업들은 사용자가 원할 때 즉시 작동해야 합니다.
하.지.만! 분석(Analytics) 업데이트와 머신 러닝, 백업 등은 바로 바로 진행할 필요가 없습니다. 급하지 않은 작업은 충전시간으로 미루면 배터리를 더 아낄 수 있습니다.
3가지 경우가 있습니다.
- BGProcessingTask : 오래 걸리는 작업을 미룰 때
- Discretrionary URLSession : 네트워크 작업 지연
- Push Priority : 적당한 시점에 Push 알림
각각을 살펴보겠습니다.
+ 아이폰을 낮에 충전하면 빠르게 충전이 가능하지만 밤에 충전하면 "05:30까지 완충" 메시지를 볼 수 있다. iOS에서 자체적으로 드라이브정리, 백업, 앱에서 미룬 작업 등을 수행하기 때문이다!!
BGProcessingTask
오래 걸리는 작업을 충전 시간으로 미룹니다. 데이터 베이스 청소, 백업, 머신러닝 트레이닝에 적합합니다.
app identifier로 BGProcessingTask API를 호출합니다. requiresExternalPower와 requiresNetworkConnectivity프로퍼티를 설정해줘야 합니다. 기기 충전 시간에 런타임을 따로 제공해 미룬 작업을 실행합니다.
Discretrionary(자유재량) URLSession
시스템으로 네트워크 처리 작업을 넘겨 적절한 시간대에 수행하도록 합니다.
- 기기 충전
- 와이파이 연결
텔레메트리(클라우드 기반 알림과 푸시 알림), TV 시리즈 다음 편 다운로드 등 사용자 의도가 없는 장시간 네트워킹에 좋습니다.
// 백그라운드로 실행
let config = URLSessionConfiguration.background(withIdentifier: "com.app.attachments")
let session = URLSession(configuration: config, delegate: ..., delegateQueue: ...)
// Set discretionary
config.isDiscretionary = true
// 다운로드 시점 계획
// timeoutInterval이 0 이면 무한 시도함으로 주의
config.timeoutIntervalForResource = 24 * 60 * 60
config.timeoutIntervalForRequest = 60
// Create request and task
var request = URLRequest(url: url)
request.addValue("...", forHTTPHeaderField: "...")
let task = session.downloadTask(with: request)
// 미래의 특정 시점까지 업로드, 다운로드 지연
task.earliestBeginDate = Date(timeIntervalSinceNow: 2 * 60 * 60)
// 예상 작업량 제공 -> 다운로드 사이에서 부하의 균형을 맞춤
task.countOfBytesClientExpectsToSend = 160
task.countOfBytesClientExpectsToReceive = 4096
task.resume()
푸시 우선순위
애플 알림 서비스인 apns 우선순위(apns-priority) 1 ~ 5 중 하나로 설정이 가능합니다. 숫자가 낮을수록 우선순위 높습니다. (1이 최고 우선순위)
푸시 우선순위에 따라 동작이 조금씩 달라집니다.
- 우선 순위가 높으면 서버가 즉시 기기로 푸시를 전달하고, 기기를 자주 깨워 배터리 소모 빨라집니다. 즉 알림 하나하나를 다 유저에게 전달합니다.
- 우선 순위가 낮으면 적절한 시점까지 전달을 미룹니다. 기기가 깨어날 때까지 기다리거나 우선순위가 높은 게 처리될 때까지 기다립니다.
정리
배터리 소비 개선을 위해 개발자가 할 수 있는 것들을 살펴봤습니다. 프레임 설정, 앱 작동 지연을 위해 내 앱의 우선순위가 무엇인지 잘 파악하고 알맞은 설정이 필요합니다.
좋아하는만큼 보인다고 내 앱을 😍 해주면 우선순위를 잘 파악할 수 있지 않을까요??? ㅎㅎ
끝!
출처
Power down: Improve battery consumption - WWDC22 - Videos - Apple Developer
Discover how you can limit your power usage and help people get even more out of your app. We'll show you how you can reduce battery...
developer.apple.com
Supporting Dark Mode in Your Web Content - WWDC19 - Videos - Apple Developer
With system-wide Dark Mode support in iOS and macOS, you'll want to make sure your web content is appropriately styled to reflect your...
developer.apple.com
'컨퍼런스 > WWDC' 카테고리의 다른 글
[WWDC 2023] TipKit 사용하기 (0) | 2023.06.29 |
---|---|
[WWDC 2023] SF Symbols 5에 애니메이션 적용하기 (with 예제 코드) (0) | 2023.06.22 |
[WWDC 2023] Swift와 C++ 같이 사용하기 (0) | 2023.06.21 |
[WWDC 2022] 개발자를 위한 새로운 기능 확인하기 - 각 기능 별 간단 요약 (1) | 2022.06.07 |
- Total
- Today
- Yesterday
- 부스트캠프
- Swift 디자인 패턴
- 앱개발
- SwiftUI
- 디자인 패턴
- 필독서
- Swift 서버
- 부스트캠프iOS
- 부스트캠프7기
- 개발
- 책리뷰
- Swift공식문서
- Swift문법
- TODO
- 날씨어플
- 애플
- ios
- 코딩
- Swift
- 프로그래머스
- vapor
- 코딩테스트
- 코딩 테스트
- UX
- todo앱
- 책후기
- Combine
- 책
- swiftUI 기초
- Swift DocC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |