본문 바로가기
프로그래밍 놀이터/iOS

[ios] beginBackgroundTaskWithExpirationHandler: 에 대한 연구

by 돼지왕 왕돼지 2018. 2. 16.
반응형

[ios] beginBackgroundTaskWithExpirationHandler: 에 대한 연구


https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler:

app 종료, background job, background task, backgroundTimeRemaining, beginBackgroundTaskWithExpirationHandler, beginBackgroundTaskWithName:expirationHandler, blocking, Clean Up, endBackgroundTask, handler, main thread, Sync, thread-safe, UIBackgroundTaskIdentifier, UIBackgroundTaskInvalid, unique, [ios] beginBackgroundTaskWithExpirationHandler: 에 대한 연구


-

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler



-

오래 진행될 새로운 background task 를 마크하는 작업을 한다.

( 마크하는 것만으로 BG 상황에서 task running 시간을 많이 늘려준다. )



-

handler 는 app 의 background 작업의 유효시간이 0 에 도달하기 직전에 불린다.

handler 는 background task 의 끝을 마크하고, clean up 시키는 데 사용해야 한다.

task end 에 실패하면 app 의 종료로 이어진다.

handler 는 main thread 에서 sync 로 불리며, app 을 순간 blocking 시킨다.



-

return value 인 UIBackgroundTaskIdentifier 는 unique 한 새로운 background task id 를 넘겨야 한다.

이 값을 task 종료를 알리기 위해 endBackgroundTask: 에 이 value 를 “반드시” 넘겨야 한다. 

background 작업이 불가능할 경우 UIBackgroundTaskInvalid 가 return 된다.



-

이 함수는 app 이 bg 로 전환된 후에 약간의 시간동안 앱이 더 진행되도록 해준다.

이 함수 호출은 app 의 UX 에 해를 입힐 수 있는 끝나지 않은 task 가 있을 때, BG 로 간다면 이 때 호출해주면 된다. 

예를 들면 중요한 파일 전송한다던지 이럴 때 쓰면 된다.

이 함수를 그냥 bg 작업을 연장하기 위한 용도로 쓰면 안된다.


이 함수 호출은 endBackgroundTask: 함수 호출과 매칭되어 balance 가 잡힌다.

모든 bg 에서 작동하는 앱은 작동할 수 있는 시간이 있고, backgroundTimeRemaining property 를 통해 얼마나 많은 시간 앱이 bg 에서 시간을 쓸 수 있는지 확인할 수 있다.


만약 endBackgroundTask: 를 time expire 전에 불러주지 않으면, system 은 app 을 종료시킨다.

만약 handler 를 전달한다면 system 은 time expire 전에 이 block 을 호출해준다.


이 함수는 app 실행 중 어떤 시점에 불러도 상관없다.

여러번 background task 를 위해 불러도 상관 없다.

하지만 모든 task 는 “반드시" 각각 end 되어야 한다.

각각의 task 는 unique 한 id 를 갖는다.


debugging 을 돕기 위해 이 함수는 호출하는 함수 이름 기반으로 이름을 만든다.

custom name 을 주고 싶다면 beginBackgroundTaskWithName:expirationHandler: 함수를 대신 불러야 한다.



-

이 함수는 thread-safe 하다.



-

실제로 테스트 결과 약 1.5초 후에 종료되던 BG 프로세스가 2분 20초 이상도 작동하는 것을 볼 수 있었다.

내 작업이 2분 20초만에 끝나서 그 이상 시간은 사실 테스트해보지 않았다.

스택 오버 플로우에 따르면 약 3분 이상을 버티는 경우도 있다고 한다.


그러나 역시나 시스템 상황에 따라서 몇 초후에 바로 종료시킬 수도 있으니..

적용하고 싶은 작업의 스케일과 중요도를 잘 파악해서 적용해야 한다.




반응형

댓글