CLOSE SEARCH

Multitasking in iOS 7 : Background Fetch, Remote Notification, Background Transfer Service

Apple은 iOS 4 에서 iOS 6까지 다양한 멀티태스킹 기법들을 iOS 앱에서 사용할 수 있도록 발전시켜왔습니다. 백그라운드에서 비디오 인코딩 작업을 완료하거나 데이터를 업로드하고, VoIP 앱이나 위치정보를 사용하는 앱이 다양한 멀티태스킹 기능을 구현할 수 있도록 지원하고 있습니다. 이 포스트에서는 iOS 6에서는 멀티태스킹의 문제점과 iOS 7에서의 개선점, 그리고 세가지 새로운 기능(Background Fetch, Remote Notification, Background Transfer Service)에 대해 간략하게 알아보겠습니다.

Background Task

iOS 6 Weak point : Battery Life & Efficiency

iOS 6에서 앱이 백그라운드 상태로 전환될 때 시작된 백그라운드 태스크(Background Task)는 허용된 시간내에 작업을 완료하기 전까지 계속 수행되었습니다. 그래서 사용자가 슬립모드로 들어가려고 했을때, 실제로는 작업이 완료될 때까지 디바이스가 활성화된 상태로 남아있었고 상대적으로 배터리 소모가 심할 수 밖에 없었습니다.

iOS 7 Difference

iOS 7에서는 실제로 사용자가 디바이스를 사용중인 경우에만 백그라운드 태스크가 수행됩니다. 만약 사용자가 디바이스를 슬립모드로 전환한다면 실행중인 백그라운드 태스크는 잠시 중지되고 사용자가 디바이스를 다시 사용할 때 재시작하는 방식으로 변경되었습니다.  iOS 7은 백그라운드 작업을 완료하기 위해 디바이스를 활성화 상태로 유지하기 않기 때문에, 이전과 같이 연속적인 실행은 보장하지 않습니다. 그렇기 때문에 멀티태스킹을 사용할 때 반드시 이 부분을 고려해야 합니다.

 

App Switcher

[one_half]

iOS 6

appswitcher_ios6_preview

[/one_half]

[one_half_last]

iOS 7

appswitcher_ios7_preview

[/one_half_last]

iOS 7의 App Switcher는 사용자가 실행했던 앱의 최신 스냅삿(Snapshot)을 화면에 표시해주고 새로운 전환 에니메이션을 통해 더 효율적으로 앱을 전환해 줍니다. 스냅샷은 백그라운드에서 자동적으로 업데이트 되기 때문에 항상 최신 상태를 유지합니다. 이를 통해 사용자는 실제 앱을 실행시키지 않고도 App Switcher에서 앱의 현재 상태를 확인할 수 있게 되었습니다.

앱을 제거하는 방식도 Long Press에서 Swipe Up 방식으로 변경되었습니다. 특히 iOS 7에서는 앱을 제거하는 경우 앱의 백그라운드 실행도 함께 중지되므로, 특정 이벤트가 발생한 경우에도 더이상 백그라운드에서는 시작되지 않습니다.

 

Background App Refresh Settings

위치 서비스를 사용하는 앱이나 뉴스스탠드 앱은 백그라운드에서 위치에 관한 작업을 처리하거나 새로운 뉴스를 다운로드 할 수 있습니다. 이런 작업들이 완료되면 앱은 App Switcher에 있는 자신의 스냅샷을 자동적으로 갱신합니다.

iOS 7 설정 앱은 이러한 동작을 구성할 수 있는 “백그라운드 응용 프로그램 갱신”이라는 새로운 설정을 제공합니다. 앱의 백그라운드 갱신을 끄는 경우 스냅샷이 갱신되지는 않지만, 배터리 성능을 향상시킬 수 있습니다.

apprefresh_setting_preview

 

NEW! Background Fetch

Background Fetch는 백그라운드에서 데이터를 가져올 수 있는 새로운 기술입니다. iOS 6까지는 데이터 다운로드를 담당하는 주체가 다운로드를 시작한 앱 자신이었지만, iOS 7에서는 iOS가 백그라운드 다운로드를 관리해줍니다. iOS는 앱이 요청한 Fetch를 통합해서 관리하고, 필요한 경우 Fetch 작업을 동시에 실행시켜 배터리 성능을 향상시킵니다. 특히, iOS 7은 사용자의 앱 사용 패턴을 분석하고 이 결과를 기반으로 Fetch 작업을 수행하는 시점을 결정합니다. 예를 들어, 사용자가 주기적으로 오전 9시에 뉴스앱을 사용한다면, 9시 이전에 Background Fetch를 실행하고 새로운 데이터를 다운로드합니다.

 

NEW! Remote Notification

push_in_ios6_preview

iOS 6에서 푸시가 도착한 뒤 메시지가 실제로 다운로드되는 시점은 사용자가 화면을 슬라이드해서 메시지를 보기로 선택한 후입니다. 그래서 연관된 앱을 통해 실제로 전체 데이터를 보기 전에 약간의 딜레이가 존재하였습니다. Apple은 이러한 문제점을 개선하기 위해 메시지 다운로드 시점을 변경하고, 새로운 content-available 플래그를 추가하였습니다.

push_in_ios7

iOS 7에서는 푸시가 전달되면 곧바로 메시지를 다운로드하고 사용자에게 알려줍니다. 사용자가 푸시 도착여부를 알기전에 메시지가 다운로드되기 때문에 iOS 6과 같은 딜레이가 발생하지 않습니다.

Silent Remote Notification 이라는 새로운 기술도 소개되었습니다. 이 기술은 일반적인 푸시와 달리 사용자에게 얼럿을 표시하지 않고 백그라운드에서 데이터를 가져오는 동작만을 수행할 수 있도록 해줍니다. 그러나 Silent Remote Notification은 Push-rate에 영향을 받습니다. Push-rate에 여유가 있는 경우에는 일반 푸시와 마찬가지로 동시에 전송되지만, Push-rate가 지나치게 높다면 바로 전송되지 않고 Apple Push Service에 임시적으로 저장됩니다. 이렇게 저장된 Silent Remote Notification은 Push-rate에 여유가 있을때 새롭게 요청된 푸시와 함께 앱으로 전달됩니다.

 

NEW! Background Transfer Service

iOS 6에서 파일전송을 구현했던 기억을 떠올려봅시다. 포그라운드에서 구현하는 경우에는 UI가 블록킹되지 않도록 스레드를 사용해야 했고, 백그라운드에서는 제한된 시간동안만 파일을 전송할 수 있었기 때문에 오류 처리를 꼭 해주어야 했고, 파일이 너무 큰 경우에는 백그라운드에서 전송을 완료할 수 없었습니다. iOS 7은 이러한 문제를 해결하기 위해 새로운 Background Transfer Service라는 새로운 기술과 NSURLSession API를 도입했습니다. 파일전송 작업의 주체가 앱에서 OS로 변경되었기 때문에, 앱의 실행여부에 관계없이 파일전송이 가능해졌고, 백그라운드 실행시간 제한은 더이상 고려할 필요가 없어졌습니다.

iOS 7은 앱에서 요청한 작업을 큐로 관리합니다. 그리고 적절한 시점에 Discretionary Transfer 방식을 사용해서 전송을 진행합니다. 이 방식은 WiFi 연결을 통해서만 동작하기 때문에 배터리 성능을 향상시켜줍니다. 백그라운드에서는 항상 Discretionary Transfer 방식으로만 동작하지만, 포그라운드에서는 직접 전송방식을 선택할 수 있습니다.

 

Filed under: Apple WWDC 2013, iOS


  1. Warning: printf() [function.printf]: Too few arguments in /www/meetkei_com/wordpress/wp-content/themes/Sparrow/functions.php on line 549
    […] http://meetkei.com/?p=2557 […]