IT/아이폰 프로그래밍

[iOS 4]어플 종료시 일어나는 Notification

KSI 2010. 8. 2. 17:06
1. iOS 4에서의 어플 종료 Notification은?

멀티태스킹이 지원되지 않던 iPhone OS 3.x까지는,

어플 종료 시에 일어나는 Notification으로 'UIApplicationWillTerminateNotification'을 많이 사용했습니다.

이 Notification을 쓰는 목적부터 말씀드리면, 홈 버튼을 눌러서 어플이 종료될 때 현재 어플의 정보를 저장하기 위해서입니다.
예를 들면, 스도쿠 게임을 하다가 갑자기 그만두고 싶어서 홈 버튼을 누르는 경우가 있겠죠.

그런데 iOS 4가 나오고 멀티태스킹이 지원되면서 이 Notification이 작동하지 않게 되었습니다.
아니, 멀티태스킹을 지원하는 어플에서만 작동하지 않게 되었습니다.
(홈 버튼을 두 번 눌러서 나오는 프로세스 바(정확한 명칭을 몰라서 이렇게 명명하겠습니다)에서 종료할 때에도 마찬가지로 Notification이 작동하지 않게 되었습니다.)

아마도
1. 홈 버튼을 누른다는 것은 어플이 완전히 종료되는 것이 아니라 ForeGround로 넘어가는 것이기 때문에
2. 프로세서 바에서 종료하는 것은 '강제종료'이기 때문에 이 Notification이 작동하지 않는 것으로 보입니다.

그런데 이상하게도 애플이 제공하는 개발자 문서에서는, iOS 4부터 이 메소드에 어떤 변경사항이 있었는 지를 기술하지 않고 있습니다.
더구나 어떠한 권고사항도 없습니다. 물론 deprecated되지도 않았구요.

2. 그러면 iOS 4의 Multi-tasking 어플에서 "어플 종료"를 인식하는 Notification은?

그래서 이것을 해결하는 방법을 나름 연구해보았습니다만...

가장 단순한 방법은, 여러분이 만드는 어플이 멀티태스킹을 지원하지 않는 방법입니다.
그런데 iOS 4에서 멀티태스킹을 지원하지 않는 어플은 경쟁력을 잃겠지요. 좋지 않은 방법입니다. :)

두번째 방법은, 'UIApplicationDidEnterBackgroundNotification'을 사용하는 것입니다.
물론 이 Notification은 "홈 버튼을 눌러서 어플이 Foreground로 넘어갈 때"만 일어나기 때문에
멀티태스킹이 지원되는 어플에서만 일어납니다.
이 Notification만 사용하면, 비 멀티태스킹의 iPhone OS 3.x을 지원할 수 없게 되지요.


그래서 제가 고안한 세번째 방법. 절충안입니다.
위의 두 Notification을 모두 사용하는 것이지요.
이 둘을 사용하는 때를 구분하는 방법은, UIDevice로부터 '버전 정보'와 '멀티태스킹 지원여부'를 읽어들여서 구분하는 겁니다.

예를 들어보지요.

-(void)viewDidLoad {
[super viewDidLoad];
UIDevice * nowDevice = [UIDevice currentDevice]; // 현재 장치의 정보를 읽어들입니다.

NSString * version = nowDevice.systemVersion; // 현재 버전을 읽고, 이를 부동소수점형인 float형 변수로 바꿉니다.
float fVersion = [version

if(dVersion >= 4.0) // 현재 장치의 iOS 버전이 4.0을 넘는 지 알아봅니다.
{
BOOL multitaskingSupported = [nowDevice multitaskingSupported]; // 이 장치가 멀티태스킹을 지원하는 지를 알아봅니다.
if(multitaskingSupported)
{
// iOS 버전이 4.0 이상이고 멀티태스킹을 지원한다면, 이 Notification에 등록합니다.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveStatus:) name:UIApplicationDidEnterBackgroundNotification object:nil];
[scanner release];
return;
}
}
// 그 외의 경우(멀티태스킹을 지원하지 않는 경우), 이 Notification에 등록합니다.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveStatus:) name:UIApplicationWillTerminateNotification object:nil];
[scanner release];
}

위의 소스 코드를 보시면, @selector(saveStatus:) 부분이 있습니다.
saveStatus: 메소드는 이 소스 파일에 들어있는, 이 어플이 저장될 때 현재 상태를 저장하는 메소드입니다.

p.s.
뭐 사실 SQLite와 코어 데이터를 이용해서 데이터를 저장하신다면,
어차피 기본적으로 ~AppDelegate.m 파일 내에 '어플 종료 시 데이터를 저장하는 메소드'가 Notification에 등록되어 있어서 상황이 조금 다르긴 합니다.
이 경우에 대해서는 어떻게 해야 하는 지 다음에 올리도록 하겠습니다. :)


출처 - 네이버 맥부기 카페 http://cafe.naver.com/mcbugi.cafe