일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Linked List
- SwiftUI
- 오브젝트
- Apple Developer Academy
- 앨런
- scrollview
- 동시성
- Codable
- 가상 메모리
- deadlock
- decode
- IOS
- core data
- Swift
- 운영체제
- @state
- 비동기
- struct
- 프로세스 스케줄링
- 동기화
- 알고리즘
- 인프런
- 데드락
- 상호배제
- Algorithm
- UserDefaults
- forEach
- 100 days of SwiftUI
- async
- COLOR
Archives
- Today
- Total
기어가더라도 제대로
[WWDC] Background Task 본문
출처
developer.apple.com/wwdc19/707
Background에서도 실행되어야할 것들
Background 실행 개요
Background 란?
- background thread, background queue, 등이 있지만 여기선
- foreground에서 실행하지 않는 작업 실행을 의미함
Background 작업으로 가야하는 이유
- App 의 요청
- download 작업, foreground 에서 미처 실행하지 못한 작업
- Event Trigger
- 사용자가 외국으로 진입한다던가,
- 반응할 필요가 있는 건상상의 데이터가 발생한 경우
백그라운드 실행에서 고려할 중요한 3가지
Power
- 에너지를 사용하고, 배터리를 사용한다.
- BG 작업이 끝날 때 suspend 상태로 앱을 돌리기 위해서 스스로의 작업이 끝났음을 시스템에게 알려야한다.
Performance
- 반응성을 높이기 위해 무거운 작업을 백그라운드에서 하는 이유가 크다.
- 앱이 사실 여러개가 구동되니까 백그라운드 작업을 실행할 때 다른 앱은 Foreground 작업을 하고 있을 수도 있다.
- 그렇다면 BG 작업이 제한적으로 할당된 CPU나 메모리보다 더 많이 사용할 경우 시스템이 Kill 할 수 있고, 이후에 해당 앱을 켰을 때 앱이 느려지는 경험을 할 것이다.
Privacy
- 사용자는 프라이버시를 중요하게 생각함
- Foreground에서는 어느 자원에 접근하리라 예상을 하지만
- Background 에 있을 때, 어느 자원에 접근하리라 예상하는 경우는 드뭄
- 그래서 FG 에서 사용할 권한의 세트와 BG에서 사용할 권한의 세트가 다르게 설정하는 것이 중요함
Best Practices
- 메시지 앱을 예시로 Best Practice 를 짜 볼 것임
- 위의 각 기능들을 달성하기 위해서 어떤 API 를 사용해야할지 알려드림
메시지 보내기
- 일반적으로 메시지를 보내면 바로 상대방이 받을 것을 기대함
- 백엔드 서버가 혼잡하거나 네트워크 문제가 있을 때 BG Task 가 활약함
- 사용자가 App을 떠나거나 phone 을 lock 할 수도 있음
- 그래서 이런 작업의 완성을 보장할 수단이 필요함
- 심지어 사용자가 앱에 돌아오지 않아도 이게 가능해야함
- "이봐, 이거 왜 안갔어?" 하고 돌아오지 않아도 가야한다는 뜻
Background Task Completion
- 앱이 suspend 되기전에 여분의 시간을 줌
- 혹은 foreground에서 시작한 일을 마무리함
- 메시지 보내기 기능이 가장 위에 있음
- 그다음 BGTask 의 Identifier 를 선언
- 선언부에는 UIApplication 이 이것을 실행하는데, 클로저 내부에는 이것이 실패했을 때 실행할 코드가 들어있음
- 그 다음 블락에는 완료가 되면 UIApplication.shared.endBackgroundTask 를 호출해야함
- 더 이상 자원 사용을 안해도된다, suspend 상태로 들어가도 된다고 알리는 역할
- 다음에 작업을 큐에 추가한다.
통화 기능
- VoIP Push notification
- 이 API 를 통하면 Foreground 로 앱이 시작함
- 통화가 왔다는 것을 알아야하고, 사용자가 그것을 받을지 말지 결정해야하기 때문
- 이렇게 하면 끝이라는데,, 2019 년에 새로운 기능이 나왔다고 한다.
- Call 에 대해서 VoIP 가 들어왔음을 알리는 콜백을 호출해야함
- `didReceiveIncomingPush`
- 하지 않으면 VoIP Push 가 앱을 시작하는 것을 막을 것임
- 발신자 정보를 push payload 에 넣으면 더욱 매끄러운 UI 구성이 가능하다.
- apns-expiration 을 0 이나 적은 숫자로 설정하라
- 이렇게 하면 사용자가 push notification을 전화가 끝난 뒤 몇 분 이내에 받는 것이 아니라, 즉시 받을 것이다.
Muted Threads
- 사용자가 시끄러운 수다방이나 상대방을 mute 하고 싶어할 수 있다.
- 메시지가 안오게 하는 것이 아닌 오긴 하되, 알림을 주지 않는 것이다.
이를 위해 Background Pushes 가 필요하다.
- apns-priority = 5 로 설정, 앱이 실행이 안될 것이다.
- apns-push-type = background 로 설정
다운로드를 밤에 하기? Background URL Session
- 다운로드를 더 적절한 시간에 하도록 연기
- 스케쥴링 하도록 정보를 제공
- 추가적인 정보를 제공할 수도 있음
새로운(?) BackgroundTasks 프레임 워크
- Cpu 모니터를 꺼서 하드웨어를 완전히 사용도 가능
- foreground 로 돌리는 것도 가능
Background App Refresh Task
- 사용자가 언제 앱을 사용하는지 학습해서, 예정된 시간 바로 전에 새로운 컨텐츠를 fetch 해오는 기능
Background Task 사용하기
- 앱이 foreground 일 때 Task Request 를 만들 수 있다.
- 여타 다른 extension 에서도 BGTask 를 스케쥴링 할 수 있다.
- 시간이나 네트워크, 배터리 양등 미리 설정해놓은 기준을 만족하면
- 앱을 깨워서 Background 상태로 넘긴다
- 넘겨서 BGProcessingTask 에 적힌 일들을 한다.
- 작업이 완료되면 완료 콜백을 넘기고, 앱을 suspend 상태로 돌린다.
두 종류의 task가 동시에 앱을 깨웠다고 가정
- 작업을 완료하기 위해 한정된 시간을 할당받음
- task 별로 작업 시간이 할당되는 것이 아니라, App 자체에 할당되는 것이기에 동시적으로 이 작업들이 실행될 수 있도록 동시성 프로그래밍을 설정해둬야함
- 작업을 완료하고 앱이 suspend로 돌아감
[데모앱] Color Feed
- Info.plist에 필요한 권한 설정
- signing & capabilites
- "+" -> Background Mode -> 다과 같은 섹션이 추가됨
- Background fetch 항목을 체크
- Info.plist 로 가서 Key 추가
- "Permitted background task scheduler identifier "
- 어느 DNS 에서 오는 refrash 신호는 받아들일 것인가 하는 부분을 설정해야함
코드 구현
BGTaskScheduler 에 어떤 작업을 할 것이라고 알리기
- task 가 발생할 때 할 작업을 정의해 놓음
- import Background Tasks
- queue 를 nil 로 하면 백그라운드 직렬큐를 하나 생성한다.
- launchHandler 안에 어떤일을 할지 실행한다.
- 백그라운드 상태로 앱이 런칭되면 실행할 부분인데, 할당된 자원을 다 사용해서 만료되었을 때 실행할 코드를 선언해 주어야함
- 완료가 되었을 때도 처리를 해놓아야함
BGTask Schedule 을 백그라운드로 앱이 들어갈 때 하기
- request 에 earliestBeginDate 부분이 추가 되었는데 이는 이렇다.
- 백그라운드 리프레시 테스크를 15분 뒤에 해
- 추가로, scheduleAppRefresh() 를 다른 코드에 넣을 수도 있다.
BG Processing Task
- signing & capabilities
- Background mode 에서 Background processing 체크 박스
- info.plist 에서 주소 추가
- app delegate 에서 BG Refresh Task 등록한 것 처럼 등록을 해준다.
- 작업 설정 후에 expirationHandler, completionBlock 을 설정해주는 것이 중요하다.
- DB 클리닝이 필요할 때 하는 로직인데, 필요하면 실시를 하도록 했다.
- 마지막 실행일로부터 일주일이 지나면 리프레시를 하는 로직
background task를 디버깅 하기
- 앱실행 -> 홈화면 -> 다시 앱으로 와서
- 일시정지후 디버깅 명령어 "디버그 스타트" 하면
- 화면이 계속 리프레시 됨
- 일시 정지 다시 한 다음 "디버그 스타트" 하면 리프레시가 멈춤
결론
- UI Update ==> BackgroundRefrash Task
- Processing ==> Background Process Task
'생각정리 > 번역글(blog, WWDC)' 카테고리의 다른 글
[iOS-WWDC] "Meet async/await in Swift" 요약 정리 (0) | 2023.02.04 |
---|---|
[번역] iOS 에서의 클린아키텍쳐와 MVVM (1) | 2022.09.14 |
CGD, Dispatch Source(feat. Event) (0) | 2022.09.01 |
[번역]UI는 왜 Main Thread 에서 업데이트 되어야 하는가?(feat. 데드락) (2) | 2022.09.01 |
[번역] 스위프트에서 재사용 가능한 이미지 캐시 (0) | 2022.08.30 |
Comments