요즘 music streamming service를 위한 application을 제작하다가 음악을 듣고 있는데 call이 올 경우에 service를 개선하고 싶었다. 다시 말해서 call을 받기 전의 상태로 복원하고 싶었다.


그 전엔 call이 오면 당연히 application이 내려가는 건 어쩔수 없지 않나 생각을 해보았지만 잘만하면 개선의 여지가 있어 보였다. 우선은 call이 올 경우의 life cycle을 debugging 해 보았다.

1. application pause

2. call view

- "전화 거절"
- "전화 받기 --> 끊기"

3. 전화를 거절할 경우

- application resume

4. 전화를 받고 끊을 경우

- application terminated
- application 재실행


자 이제 실마리가 보였다!!!


우선 application 의 pause와 resume에 대한 notification method를 찾았다.

- (void)applicationWillResignActive:(UIApplication *)application
{
   
}

- (void)applicationDidBecomeActive:(UIApplication *)application 
{

}


이젠 전화가 오고 다시 다시 application이 돌아올 경우에 대해서 algorithm을 설계 해주기만 하면 문제가 해결될 같았다. 하지만 로직 설계 후 복병이 있었다. 그것은 바로 lock mode 진입과 call interruption의 사이클이 비슷한 것이였다.

이 둘을 구분할 방법은 없을까?

우선 lock mode의 life cycle을 분석해 보았다.

1. application pause

2. application resume

3. application terminated


방법이 아주 없진 않았다.

전화가 올 경우엔 pause --> terminated --> load --> become 을 타고
락모드에서 어플 종료의 경우는 반드시 pause --> become --> terminated --> load --> become을 탄다는 것이다.

다시 말해서 call이 올 경우나 lock mode일 경우나 application 종료 시 (terminated) state 값을 저장하지만 (단, application 종료가 발생하기 때문에 파일로 저장이 필요!) resign 과 become의 쌍으로 들어올 경우 즉, lock mode에서 풀려 났을 경우 초기화 시켜 줄 state 변수를 하나 생성해 주기만 하면 간단히 해결될 일이였다.


그래서 count를 주었다.

우선 count는 application 시작과 함께 '0'의 default를 갖고 시작을 하며
최초의 life cycle에 따라 becomeActive를 타고 '-1'을 가지고 화면이 나타나게 된다.


이젠 케이스를 따져보자

1. lock mode

-1 --> resign('0') --> become('-1') --> terminated('-1'의 값을 저장한다.)

2. call interruption
 
-1 --> resign('0') --> terminated('0'의 값을 저장한다.)



이제 application 재 실행 시 파일로 저장해 두었던 전의 상태값 즉, '0'일 경우(전화가 왔을 경우)에만 다시 전화가 오기 전의 화면 및 서비스 로직으로 바로 JUMP!!!!를 시켜 주면 되는 것이다.

이러한 서비스는 music streamming service나 game에서 아주 유용하게 쓰일 것이라 생각한다.

아래 코드를 참조하길 바란다.

- application pause

- (void)applicationWillResignActive:(UIApplication *)application

{

    NSLog(@"=============================================");

    NSLog(@"applicationWillResignActive");

 

    jumpCount ++;

   

}



- application resume
"상태값을 로드한다. 로드를 할 경우 상태값이 -1일 경우에만 jump할 수 있으면 된다."





- (void)applicationDidBecomeActive:(UIApplication *)application 

{

    NSLog(@"=============================================");

    NSLog(@"applicationDidBecomeActive");

    

    [self loadState];

    

    jumpCount --;

}



- application 종료
"상태값을 저장한다."
- (void)applicationWillTerminate:(UIApplication *)application 
{
    [self saveState];
}



Share/Bookmark

태그 : iPhone
이전 1 2 3 4 5 6 ... 70 다음