기어가더라도 제대로

[WWDC] Background Task 본문

생각정리/번역글(blog, WWDC)

[WWDC] Background Task

Damagucci-juice 2022. 10. 27. 15:24

출처

developer.apple.com/wwdc19/707

Background에서도 실행되어야할 것들

Background Task image

Background 실행 개요

Background 란?

Background Task image

  • background thread, background queue, 등이 있지만 여기선
  • foreground에서 실행하지 않는 작업 실행을 의미함

‏‏‎ ‎

Background 작업으로 가야하는 이유

  • App 의 요청
    • download 작업, foreground 에서 미처 실행하지 못한 작업
  • Event Trigger
    • 사용자가 외국으로 진입한다던가,
    • 반응할 필요가 있는 건상상의 데이터가 발생한 경우

‏‏‎ ‎

백그라운드 실행에서 고려할 중요한 3가지

Power

  • 에너지를 사용하고, 배터리를 사용한다.

Background Task image

  • BG 작업이 끝날 때 suspend 상태로 앱을 돌리기 위해서 스스로의 작업이 끝났음을 시스템에게 알려야한다.

Performance

  • 반응성을 높이기 위해 무거운 작업을 백그라운드에서 하는 이유가 크다.

Background Task image

  • 앱이 사실 여러개가 구동되니까 백그라운드 작업을 실행할 때 다른 앱은 Foreground 작업을 하고 있을 수도 있다.
  • 그렇다면 BG 작업이 제한적으로 할당된 CPU나 메모리보다 더 많이 사용할 경우 시스템이 Kill 할 수 있고, 이후에 해당 앱을 켰을 때 앱이 느려지는 경험을 할 것이다.

Privacy

  • 사용자는 프라이버시를 중요하게 생각함
  • Foreground에서는 어느 자원에 접근하리라 예상을 하지만
  • Background 에 있을 때, 어느 자원에 접근하리라 예상하는 경우는 드뭄
  • 그래서 FG 에서 사용할 권한의 세트와 BG에서 사용할 권한의 세트가 다르게 설정하는 것이 중요함

Best Practices

  • 메시지 앱을 예시로 Best Practice 를 짜 볼 것임

Background Task image

  • 위의 각 기능들을 달성하기 위해서 어떤 API 를 사용해야할지 알려드림

메시지 보내기

  • 일반적으로 메시지를 보내면 바로 상대방이 받을 것을 기대함
  • 백엔드 서버가 혼잡하거나 네트워크 문제가 있을 때 BG Task 가 활약함
    • 사용자가 App을 떠나거나 phone 을 lock 할 수도 있음
    • 그래서 이런 작업의 완성을 보장할 수단이 필요함
    • 심지어 사용자가 앱에 돌아오지 않아도 이게 가능해야함
      • "이봐, 이거 왜 안갔어?" 하고 돌아오지 않아도 가야한다는 뜻

Background Task Completion

  • 앱이 suspend 되기전에 여분의 시간을 줌
  • 혹은 foreground에서 시작한 일을 마무리함

Background Task image

Background Task image

  • 메시지 보내기 기능이 가장 위에 있음
  • 그다음 BGTask 의 Identifier 를 선언
  • 선언부에는 UIApplication 이 이것을 실행하는데, 클로저 내부에는 이것이 실패했을 때 실행할 코드가 들어있음
  • 그 다음 블락에는 완료가 되면 UIApplication.shared.endBackgroundTask 를 호출해야함
    • 더 이상 자원 사용을 안해도된다, suspend 상태로 들어가도 된다고 알리는 역할
  • 다음에 작업을 큐에 추가한다.

통화 기능

  • VoIP Push notification
  • 이 API 를 통하면 Foreground 로 앱이 시작함
  • 통화가 왔다는 것을 알아야하고, 사용자가 그것을 받을지 말지 결정해야하기 때문

Background Task image

  • 이렇게 하면 끝이라는데,, 2019 년에 새로운 기능이 나왔다고 한다.
  • Call 에 대해서 VoIP 가 들어왔음을 알리는 콜백을 호출해야함
  • `didReceiveIncomingPush`
  • 하지 않으면 VoIP Push 가 앱을 시작하는 것을 막을 것임

Background Task image

Background Task image

  • 발신자 정보를 push payload 에 넣으면 더욱 매끄러운 UI 구성이 가능하다.
  • apns-expiration 을 0 이나 적은 숫자로 설정하라
    • 이렇게 하면 사용자가 push notification을 전화가 끝난 뒤 몇 분 이내에 받는 것이 아니라, 즉시 받을 것이다.

Muted Threads

  • 사용자가 시끄러운 수다방이나 상대방을 mute 하고 싶어할 수 있다.
  • 메시지가 안오게 하는 것이 아닌 오긴 하되, 알림을 주지 않는 것이다.

이를 위해 Background Pushes 가 필요하다.

  • apns-priority = 5 로 설정, 앱이 실행이 안될 것이다.
  • apns-push-type = background 로 설정

‏‏‎ ‎

다운로드를 밤에 하기? Background URL Session

  • 다운로드를 더 적절한 시간에 하도록 연기
  • 스케쥴링 하도록 정보를 제공

Background Task image

  • 추가적인 정보를 제공할 수도 있음

Background Task image

새로운(?) BackgroundTasks 프레임 워크

Background Task image

  • Cpu 모니터를 꺼서 하드웨어를 완전히 사용도 가능
  • foreground 로 돌리는 것도 가능

Background App Refresh Task

  • 사용자가 언제 앱을 사용하는지 학습해서, 예정된 시간 바로 전에 새로운 컨텐츠를 fetch 해오는 기능

‏‏‎ ‎

Background Task 사용하기

Background Task image

  • 앱이 foreground 일 때 Task Request 를 만들 수 있다.
  • 여타 다른 extension 에서도 BGTask 를 스케쥴링 할 수 있다.

Background Task image

  • 시간이나 네트워크, 배터리 양등 미리 설정해놓은 기준을 만족하면
  • 앱을 깨워서 Background 상태로 넘긴다
  • 넘겨서 BGProcessingTask 에 적힌 일들을 한다.

Background Task image

  • 작업이 완료되면 완료 콜백을 넘기고, 앱을 suspend 상태로 돌린다.

Background Task image

두 종류의 task가 동시에 앱을 깨웠다고 가정

Background Task image

  • 작업을 완료하기 위해 한정된 시간을 할당받음
  • task 별로 작업 시간이 할당되는 것이 아니라, App 자체에 할당되는 것이기에 동시적으로 이 작업들이 실행될 수 있도록 동시성 프로그래밍을 설정해둬야함
  • 작업을 완료하고 앱이 suspend로 돌아감

‏‏‎ ‎

[데모앱] Color Feed

  • Info.plist에 필요한 권한 설정
  • signing & capabilites
    • "+" -> Background Mode -> 다과 같은 섹션이 추가됨

Background Task image

  • Background fetch 항목을 체크
  • Info.plist 로 가서 Key 추가
  • "Permitted background task scheduler identifier "
    • 어느 DNS 에서 오는 refrash 신호는 받아들일 것인가 하는 부분을 설정해야함

Background Task image

Background Task image

‏‏‎ ‎

코드 구현

BGTaskScheduler 에 어떤 작업을 할 것이라고 알리기

  • task 가 발생할 때 할 작업을 정의해 놓음
  • import Background Tasks

Background Task image

  • queue 를 nil 로 하면 백그라운드 직렬큐를 하나 생성한다.
  • launchHandler 안에 어떤일을 할지 실행한다.

Background Task image

  • 백그라운드 상태로 앱이 런칭되면 실행할 부분인데, 할당된 자원을 다 사용해서 만료되었을 때 실행할 코드를 선언해 주어야함
  • 완료가 되었을 때도 처리를 해놓아야함

Background Task image

BGTask Schedule 을 백그라운드로 앱이 들어갈 때 하기

Background Task image

Background Task image

  • request 에 earliestBeginDate 부분이 추가 되었는데 이는 이렇다.
    • 백그라운드 리프레시 테스크를 15분 뒤에 해
  • 추가로, scheduleAppRefresh() 를 다른 코드에 넣을 수도 있다.

BG Processing Task

  • signing & capabilities
  • Background mode 에서 Background processing 체크 박스

Background Task image

  • info.plist 에서 주소 추가

Background Task image

Background Task image

  • app delegate 에서 BG Refresh Task 등록한 것 처럼 등록을 해준다.

Background Task image

  • 작업 설정 후에 expirationHandler, completionBlock 을 설정해주는 것이 중요하다.

Background Task image

  • DB 클리닝이 필요할 때 하는 로직인데, 필요하면 실시를 하도록 했다.
  • 마지막 실행일로부터 일주일이 지나면 리프레시를 하는 로직

background task를 디버깅 하기

  • 앱실행 -> 홈화면 -> 다시 앱으로 와서
  • 일시정지후 디버깅 명령어 "디버그 스타트" 하면
  • 화면이 계속 리프레시 됨
  • 일시 정지 다시 한 다음 "디버그 스타트" 하면 리프레시가 멈춤

 

결론 

  • UI Update ==> BackgroundRefrash Task
  • Processing ==> Background Process Task

‏‏‎ ‎

Comments