반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함


Posted on . Written by


요즘 점점 관심을 모으고 있는 것 중에 "놓고 간 곳에서 pick up" 하는 기능이나 멈추고 다시 시작하는 과정에서 매끄럽게 동작이 이뤄지는 것이 있습니다. 점점 앱이 이전에 stop 했던 곳에서 다시 시작하는 기능이 많아 졌습니다.

유저가 마지막에 있었던 곳에서 다시 앱을 시작하도록 하는것은 state saving 로 불리기도 하고 이 주제가 오늘 제가 다룰 주제입니다. 이곳에 포스트된 튜토리얼들은 여러분이 앱을 개발하면서 필요로 하는 부분에 대해 어떻게 해야 하는지를 알려주는 튜토리얼이 되도록 구성하고 있습니다.





Resuming Suspended Apps


디폴트로 앱이 suspended 됐을 때 (예를 들어 유저가 폰의 홈버튼을 눌렀을 때 등) 여러분 앱은 실제로 중지된것이 아닙니다. 그 앱은 suspended state로 됩니다. 그리고 유저가 간 곳에서 떠날 때 (left off) 그 앱은 다시 실행됩니다. 이렇게 suspended 상태에서 앱이 끝나는 경우는 너무 많은 앱을 띄워서 메모리가 부족할 때 device의 operating system이 suspended 상태의 앱을 quit 시킬 때 입니다.

이런 default로 설정된 상황을 바꾸려면 iOS 앱의 경우는 build.settings에서 UIApplicationExitsOnSuspend 를 true로 놓으면 됩니다. 디폴트는 fault 인데요. 그 의미는 이 앱이 left off 상황일 때 자동적으로 재시작 되도록 한다는 의미입니다. (OS가 이 앱을 quit 하는 경우는 해당이 안 되겠죠.)


iphone = {
  plist = {
    UIApplicationExitsOnSuspend = true
  }
}


대부분 유저는 본인의 의지로 앱을 떠납니다. 하지만 가끔 그렇지 않을 때도 있습니다. (전화가 걸려 온다던지 하는 경우) 그래서 그런 경우 user's experience를 깨지 않도록 재시작(resume) 상황에서 뭔가를 작동하도록 만드는 것은 개발자의 판단에 달려있습니다. 이 상황에 딱 맞는 예는 게임하는 상황입니다.
예를 들어 두들 점프 (Doodle Jump)를 하고 있는 중간에 앱을 닫았고 나중에 다시 돌아올 때 이 게임을 pause screen으로 할 수 있습니다. 만약 전화통화가 끝났는데 바로 character가 점프 해 있는 상황이 된다면 그 판은 여러분의 high score를 깨기 힘든 상황이 될 겁니다. pause screen으로 재시작하는 것은 user-experience 관점에서 훨씬 좋은 흐름일 것입니다.

다행히도 코로나 (Corona)는 여러분의 앱이 suspend 됐거나 resume 될 때 system events를 사용할 수 있도록 합니다. 아래에 앱이 suspend 됐을 때 어떻게 게임을 pause 시키는지를 보여주는 예제가 있습니다.


local function onSystemEvent( event )
    if (event.type == "applicationSuspend") then
        pause_game()
    end
end
Runtime:addEventListener( "system", onSystemEvent )


pause_game() 함수가 무슨일을 하는지는 여러분이 구현하기 나름이지만 대략 어떤 일을 해야 될지는 알겠죠? 일단 global Runtime객체에 리스너를 추가했습니다. 그리고 이 이벤트가 call 됐을 때 실행 될 특정 함수를 지정했습니다.

그 함수안에서는 event.type 이 "applicationSuspend" 인 것을 체크해서 그럴 경우 실행할 함수를 명시했습니다.


Resuming from a “cold” start


지금 다룰 시나리오는 조금 어렵습니다. 여러분 앱이 cold로 시작 됐을 때 (예를 들어 suspended가 아니라 closed나 quit 상태에서 시작됐을 때) 디폴트 behavior는 처음 (main.lua) 부터 새로 시작하는 것일 겁니다.

첫번째로 하셔야 될 일은 현재 상태를 save 하셔야 되는 겁니다. 어떤 방법으로 저장할지는 여러분 마음이지만 table 형태로 데이터를 저장하고 이것을 JSON 스트링으로 converting 하고 file로 저장한 다음에 나중에 로드하시기를 권고 드립니다. (이런 경우 코로나에서 file 읽고 쓰기 부분을 참조하세요.)

다음으로 파일을 파일을 로드하고 앱에게 시작됐을 때 이 데이터를 근거로 어떤 일을 하라고 알려 주어야 합니다. 이럴 경우 suspended 상태이건 cold 상태이건 앱이 새로 시작할 때 이전 상황과 이어지는 상황에서 앱을 다시 시작할 수 있을 겁니다.

데이터를 저장하는 시기는 조금 전에 셋업한 시스템 이벤트 리스너에서 event.type이 applicationExit 일 경우를 체크해서 수행하시면 도비니다. 그리고 나서 event.type이 applicationOpen일 경우 저장해 뒀던 데이터를 로드하고 그것을 근거로 어떤 일들을 수행하면 됩니다.


local function onSystemEvent( event )
    if (event.type == "applicationExit") then

        save_state()    

    elseif (event.type == "applicationOpen") then

        load_saved_state()

    elseif (event.type == "applicationSuspend") then

        pause_game()

    end
end
Runtime:addEventListener( "system", onSystemEvent )


예제를 보니 그렇게 복잡해 보이지 않죠?

save_state()나 load_saved_state() 함수와 관련해서는 더이상 자세한 내용을 언급하지는 않겠ㅅ브니다. 왜냐하면 이것은 앱마다 다 다를 테니까요. 적어도 특히 게임에서는 객체들이 화면상에 있는 정보인 프로퍼티들과 위치들 같은 데이터들을 저장해야 할 겁니다. (그래야지 load_saved_state() 함수에서 그 객체들을 이전에 있던 위치에 display 할 수 있으니까요.)

유저들은 마음대로 그 앱을 열었다 닫았다 할 겁니다. 그리고 그러한 상황에서 유저들에게 자연스러운 앱의 진행상황을 제공하려면 여러분은 그 앱이 suspended나 cold state에서 다시 재시작할 때 유저들이 아무런 끊김없는 혹은 뭔가 당황스러운 상황이 없는 화면 전개를 보여주는데 신경을 쓰셔야 될겁니다.

반응형

Comment