Choosing Background Strategies for Your App

Panther·2021년 8월 16일
0

https://developer.apple.com/documentation/backgroundtasks/choosing_background_strategies_for_your_app

"Select the best method of scheduling background runtime for your app."

앱에서 백그라운드 런타임 스케줄링을 위한 최선의 메소드를 선택합니다.

Overview

앱이 포어그라운드에서 실행중이지 않을 때 작업 완료를 위한 연산 리소스를 요구하는 경우 백그라운드 런타임을 가져오기 위해 선택할 수 있는 몇 가지 전략이 있습니다. 앱을 위해 올바른 전략을 선택하는 것은 백그라운드에서 어떻게 기능하는지에 따라 달라집니다.

어떤 앱은 포어그라운드에서도 짧은 시간 동안 작업을 수행하며, 백그라운드에 진입하는 경우에도 방해받지 않고 계속 작업이 수행되어야 합니다. 다른 앱은 이후 혹은 하루에 걸쳐 기기 충전 동안 백그라운드에서 작업을 수행하도록 지연시킵니다. 또 어떤 경우의 앱은 다양한 시점과 예측할 수 없는 시점에서 백그라운드 프로세싱을 요구하며, 외부 이벤트 혹은 메시지가 도착하는 시점이 그 예입니다.

백그라운드에서 어떻게 활동을 스케줄링할지에 따라 앱을 위한 하나 혹은 하나 이상의 메소드를 선택하시기 바랍니다.

Continue Foreground Work in the Background

시스템은 언제든지 앱을 백그라운드에 위치시킬 수 있습니다. 앱이 백그라운드에서 실행되는 동안에 수행을 계속해야 하는 중요한 작업이 있는 경우 시스템에게 알릴 수 있도록 beginBackgroundTask(withName:expirationHandler:)를 사용하시기 바랍니다. 앱이 메시지를 보내는 것을 완료해야 하거나 파일을 저장하는 것을 완료해야 하는 경우 이 접근방식을 고려하시기 바랍니다.

시스템은 백그라운드에 진입할 때 작업 수행을 위한 제한된 양의 시간만을 승인합니다. 이 시간을 초과하지 않아야 하며, 시간이 작업을 취소하거나 지연시키기에 다 된 경우를 고려하기 위해 만료 핸들러를 사용해야 합니다.

작업이 완료되면 시간 제한이 만료되기 전에 endBackgroundTask(_:) 를 호출해서 앱이 일시정지될 수 있도록 해야 합니다. 시스템은 이 메소드 호출을 실패하면 앱을 종료시킵니다.

파일 다운로드 혹은 업로드처럼 작업이 시간을 소요하는 경우 URLSession을 사용하시기 바랍니다. 더 많은 정보는 Downloading Files in the Background를 보시기 바랍니다.

Downloading Files in the Background
https://developer.apple.com/documentation/foundation/url_loading_system/downloading_files_in_the_background
https://velog.io/@panther222128/Downloading-Files-in-the-Background

Defer Intensive Work

배터리 수명 및 성능을 유지하려면 활동이 적은 시간 동안 백그라운드 작업을 스케줄링할 수 있으며, 예를 들어 기기가 충전되는 밤 시간이 대표적입니다. 앱이 무거운 작업을 관리하는 경우 이와 같은 방법을 사용하시기 바랍니다. 머신러닝 모델 훈련 혹은 데이터베이스 유지보수 수행과 같은 작업이 대표적입니다.

BGProcessingTask를 사용해서 이와 같은 백그라운드 작업의 타입을 스케줄링해야 하며, 시스템은 백그라운드 작업을 launch할 최선의 시간을 결정하게 될 것입니다.

Update Your App’s Content

앱은 컨텐트 리프레시 혹은 다른 작업 수행을 위해 백그라운드 시간의 짧은 버스트를 요구할 수도 있습니다. 예를 들어 앱이 주기적으로 서버로부터 컨텐트를 가져오거나 내부 상태에 대해 정기적으로 업데이트하는 것이 있습니다. 이와 같은 경우 BGAppRefreshTaskRequest를 요청해서 BGAppRefreshTask를 사용하시기 바랍니다.

시스템은 백그라운드 작업 launch를 위한 최선의 시간을 결정하며, 백그라운드 런타임의 30초까지를 제공합니다. 이 시간 안에 작업을 완료해야 하고 setTaskCompleted(success:)를 호출해야 합니다. 혹은 시스템이 앱을 종료시킵니다. 더 많은 정보는 Background Tasks를 보시기 바랍니다.

Background Tasks
https://developer.apple.com/documentation/backgroundtasks
https://velog.io/@panther222128/Background-Tasks

Wake Your App with a Background Push

백그라운드 푸시는 백그라운드에서 앱을 조용히 깨웁니다. 백그라운드 푸시는 알림을 표시하지 않고, 소리를 내지 않으며, 앱의 아이콘에 badge를 달지도 않습니다. 앱이 빈번하지 않게 서버로부터 컨텐트를 가져오거나 불규칙한 시간을 두고 컨텐트를 가져오는 경우 새 컨텐트가 사용 가능한 시점에 앱에게 알릴 수 있도록 백그라운드 푸시를 사용하시기 바랍니다. 소리를 끈 대화를 사용하는 메시지 앱은 백그라운드 푸시 솔루션을 사용할 것이며, 사용자에게 알림 없이 새 이메일을 처리하는 이메일 앱도 마찬가지입니다.

백그라운드 푸시를 보낼 때 content-available을 알림, 소리, badge 없이 1로 설정하시기 바랍니다. 시스템은 컨텐트 다운로드를 위해 언제 앱을 launch할지 결정합니다. 앱 launch를 보장하려면 apns-priority를 5로 설정하고, apns-push-type을 백그라운드로 설정하시기 바랍니다.

시스템이 application(_:didReceiveRemoteNotification:fetchCompletionHandler:)를 사용해서 원격 노티피케이션을 전달하면, 앱은 작업 완료까지 30초를 갖습니다. 앱이 작업을 수행하면 전원을 절약하기 위해 가능한 빠르게 전달된 컴플리션 핸들러를 호출해야 합니다. 한 시간 안에 세 번 이상 빈번하게 백그라운드 푸시를 보내면 시스템은 속도에 제한을 둡니다. 더 많은 정보는 Pushing Background Updates to Your App을 보시기 바랍니다.

Pushing Background Updates to Your App
https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app
https://velog.io/@panther222128/Pushing-Background-Updates-to-Your-App

Request Background Time and Notify the User

앱이 백그라운드에서 작업 수행을 요구하고 사용자에게 노티피케이션을 보여줄 필요가 있다면, Notification Service Extension을 사용하시기 바랍니다. 예를 들어 이메일 앱은 새 이메일 다운로드 후 사용자에게 알려줄 필요가 있을 것입니다. UNNotificationServiceExtension을 서브클래싱하고 시스템 확장을 번들로 만들어야 합니다. 푸시 노티피케이션을 받기까지 서비스 확장은 didReceive(_:withContentHandler:)를 통해 백그라운드 런타임을 개우고 가져옵니다.

확장이 작업을 완료하면 사용자에게 전달하려는 컨텐트와 함께 컨텐트 핸들러를 호출해야 합니다. 확장은 컨텐트를 수정하고 contentHandler 블록을 실행하기에 제한된 시간을 갖습니다.

See Also


Essentials

BGTaskScheduler

백그라운드에서 앱을 launch 하는 작업 요청에 대해 스케줄링하기 위한 클래스입니다.

https://developer.apple.com/documentation/backgroundtasks/bgtaskscheduler
https://velog.io/@panther222128/BGTaskScheduler

Starting and Terminating Tasks During Development

작업을 시작하기 위해, 그리고 컴플리션 전에 작업을 종료시키기 위해 개발 중 디버거를 사용합니다.

https://developer.apple.com/documentation/backgroundtasks/starting_and_terminating_tasks_during_development
https://velog.io/@panther222128/Starting-and-Terminating-Tasks-During-Development


0개의 댓글