Local Notifications Guide (iOS)
이번주 화요일의 튜토리얼은 코로나의 Local Notification 기능에 대해 다루겠습니다. 현재 iOS 플랫폼에서만 가능합니다.
여러분 앱의 사용자가 local notification을 받으면 alert 하게 될 거고 소리가 날 거고 메세지가 뜰 겁니다. 그리고 그 notification과 관련된 어떤 행동을 할 수 있는 옵션들이 제공 될 겁니다.
notification을 받을 때 여러분의 앱이 foreground에 있지 않으면 (예를 들어 유저가 인터넷 서핑을 한다 던지, 페이스북을 한다 던지 등등) 유저에게 메세지를 보여줄 수 있습니다. 그리고 여러분의 앱으로 돌아갈 수 있도록 하는 옵션을 줄 수 있습니다. 그러면 여러분 앱을 좀 더 많이 사용할 수 있도록 하겠죠.
Notification은 아주 customizable 합니다. 소리를 내게 할 수도 있고 메세지를 보일수도 있고 앱 아이콘에 badge count를 넣을 수도 있습니다. 또한 user가 특정 notification에 답했을 때 정확히 여러부닝 필요로하는 것을 수행하기 위해서 custom data를 여러분 앱에 pass 할 수도 있습니다.
오늘 다룰 튜토리얼에서는 코로나의 이 local notification 에 대해 알아야 할 모든것에 대해 다루겠습니다.
Local vs. Push Notifications
Local Notification하고 Push Notifications 하고 헛갈리지 마세요. 유저 입장에서 보면 alert이나 message, sound, badge icon 등등 모두 똑 같겠지만 개발자 입장에서는 분명히 다르니까요.
Push와 Local Notification의 다른점은 Push notification은 원격 서버에서 와서 유저에게 push 되는 겁니다.(내부적으로-locally- 따로 정해진 스케줄에 따라 일어나는 것이 아닙니다) 이건 셋업하는데 조금 더 복잡합니다 (보안 문제 같은것들을 생각해야 하거든요.) 그리고 서버를 셋업해야 되기 때문에 비용도 높은 편입니다. (유저가 많을 경우에는 더 그렇겠죠.)
Local notification을 보면 모든것이 유저의 device에서 locally 처리 됩니다. 그리고 미리 지정된 시간이나 간격 등이 세팅돼 있습니다. (scheduled) 그러니까 원격 서버가 필요 없는거죠. (추가적인 비용 발생이 없다는 겁니다.) 또 다른 잇점은 코로나에서 이 Locall Notification을 셋업 하는 것은 아주 쉽다는 겁니다.
사실 여러분들이 Push notification으로 하고자 하는 많은 것들을 local notification으로 할수 있는경우가 많습니다. 또 Local 로만 할 수 있는 것들도 있구요. 예를 들어 여러분들의 앱에서 원격에서 데이터를 가져올 필요가 없다면 Push 보다는 Local을 사용하는 것이 훨씬 더 나을 겁니다.
Scheduling Notifications
Notification에 대한 일정을 잡기 위해 (schedule) system.scheduleNotification() 함수를 사용해야 합니다.
신택스는 아래와 같습니다. 두 방법 모두 유효합니다.
system.scheduleNotification( coordinatedUniversalTime [, options] )
이 함수는 나중에 notification을 cancle 하는 데 사용할 수 있는 reference ID를 return 합니다. 나중에 이 cancel 부분을 구현하려면 system.cancelNotification() 함수를 사용하시면 됩니다.
이 notification을 일정 시간 후로 일정을 잡으려면 secondsFromNow를 사용하거나 universal time을 사용해서 특정 date/time을 지정해 주시면 됩니다.
다룰 것들이 많이 있지만 오늘은 secondsFromNow를 사용해 보겠습니다. 만약 여러분이 coordinated universal time option을 사용하고 싶으시면 coordinatedUniversalTime argument에 대해 좀 더 자세한 설명이 있는 system.scheduleNotification() API 문서를 보세요.
두번째 argument는 secondsFromNow 를 선택했느냐 coordinatedUniversalTime를 선택했느냐와 관계 없이 사용하는 겁니다. 이것은 여러분의 notification에 대해 특정 정보를 보관하고 있는 options 테이블 입니다.
- alert – 유저에게 보여지는 메세지
- badge – 앱 아이콘에 보여지는 badge number
- sound – notificatin을 받으면 play 될 sound file
- custom – Custom data/params to be used by your app, relevant to the notification (can be a variable, table, JSON string, etc).
개와 관련된 앱을 만든다고 가정하고 들어주세요. 여러분 앱은 10분(600초) 후에 강아지에게 먹이를 주어야 하는걸 알려주기 위해 notification 일정을 잡을겁니다. 그 예제는 아래와 같습니다.
local badge_count = native.getProperty( "applicationIconBadgeNumber" )
local notifyOptions =
{
alert = "Time to feed your pet!",
badge = badge_count + 1,
sound = "woof.caf",
custom = { scene = "pet_shop" }
}
local feed_notifier = system.scheduleNotification( 600, notifyOptions )
맨 처음에 native.getProperty( “applicationIconBadgeNumber” )를 사용해서 현재 application badge number를 받았습니다. 그리고 options table에서 그 숫자를 1 증가시켜서 세팅했습니다.
나머지는 그냥 보시면 아실겁니다. notification을 600초(10분)로 일정을 잡았고 두번째 인자로 notifyOptions table 을 전달했습니다.
notifyOptions table 안에 custom data로 launch_scene key 를 pass 했습니다. 이것은 이 notification을 받을 때 pet_shop으로 가도록 하기 위해 notification listener안에 있는 이 데이터를 보관하게 하는 겁니다. 나중에 이 데이터를 사용해서 pet_shop scene 으로 가겠죠. 이 custom 옵션에 무엇을 넣느냐는 전적으로 여러분 마음입니다.
Notification Listener
이 notification을 scheduling 하는 것은 단지 첫번째 step일 뿐입니다. 이제 이 notification을 받으면 어떤 것을 하도록 만들어야 합니다. 이 작업은 notification event listener 를 사용해서 작업합니다.
예제를 보여드리기 전에 여러분의 notification event listener function에 pass 될 event data를 알려드리겠습니다.
- event.name – evnet.name은 항상 "notification” 입니다.
- event.custom – 여러분이 custom option 을 통해서 pass 한 custom data 입니다.
- event.type – 이 값은 항상 “local”이 될 겁니다.
아래 notification listener 와 관련된 예제가 있습니다.
-- notification received, go to specified scene
if event.custom.scene then
storyboard.gotoScene( event.custom.scene )
end
end
Runtime:addEventListener( "notification", notificationListener )
이 전에 notificatin schedule을 잡을 때 custom data로 scene key를 설정했죠? 위에서 보듯이 이 값은 event.custom에다 해당 key 값을 넣어서 그 value를 받아오도록 돼 있습니다. 프로그래밍을 하면서 다양하게 사용될 수 있겠네요.
NOTE: 위에서 보듯이 global Runtime object를 사용해서 notification event를 add 하실 수 있습니다.
Canceling Notifications
system.cancelNotification()
function를 사용하면 notification을 cancel 하실 수 있습니다. 이 함수를 call 할 때 두가지 옵션이 있습니다. system.scheduleNotification()에서 return 된 reference ID를 첫번째 argument에 넣어서 특정 notification을 cancel 할 수 있구요, 아니면 아무것도 안 넣고 현재 있는 모든 notification들을 cancel 할 수도 있습니다.
위에 예제로 만든 notification을 cancel 하려면 아래와 같이 하시면 됩니다.
아래와 같이 하면 현재 schedule 된 모든 notification 이 cancel 됩니다.
launchArgs (Important)
유저가 여러분의 앱을 사용하고 있지 않을 때 local notification 이 왔다면 그 notification의 성격에 따라서 유저에게 알리거나 특정 scene으로 안내하고 싶으실 겁니다. 위에서 보았듯이 이런 작업은 notification event listener를 통해서 handle 해야 합니다.
문제는 여러분의 앱이 suspend 되거나 close 됐을 때 그 notification listener는 active 상태가 아니라는 겁니다.
경우에 따라 위의 예제의 경우 앱을 실행 할 때 main scene 이 아니라 pet_store로 가도록 해야 할 수도 있습니다. 이럴 때 launchArgs를 사용합니다.
main.lua
------------
local function notificationListener( event )
-- notification received, go to specified scene
if event.custom.scene then
storyboard.gotoScene( event.custom.scene )
end
end
Runtime:addEventListener( "notification", notificationListener )
------------
if launchArgs and launchArgs.notification then
-- call the event listener manually:
notificationListener( launchArgs.notification )
end
위에서 보듯이 notification listener는 이전 예제에서 보여 드렸던 그 리스너랑 똑 같습니다. 다른 점은 main.lua 의 첫번째 라인에서 launchArgs 변수를 선언해서 실행 될 부분을 assign 한다는 겁니다.(the “…” is literal; not placeholder text).
notificationListener() function 내 어딘가에 launchArgs 에 attached 된 notification
table 과 함께 앱이 시작됐는지 체크해야 합니다.
그러면서 이 listener function을 manually invoke 하게 됩니다. 이 listener 함수는 첫번째 argument로 launchArgs.notification 를 전달 했다는 것을 기억해 두세요.
여기까지 입니다. 코로나에서 local notifications 의 일정을 잡고 어떤 동작을 하도록 하는 것에 대해 모두 배우셨습니다. 이것을 활용하셔서 다양한 효과를 내실 수 있을 겁니다.
'Corona SDK > Corona Doc' 카테고리의 다른 글
Best Practices for Organizing Projects (2) | 2012.07.11 |
---|---|
코로나에서 객체와 변수 확실하게 제거하기 (0) | 2012.07.04 |
How to Use Custom Events in Corona (0) | 2012.06.28 |
Corona API Reference 제대로 활용하기 (2) | 2012.06.22 |
Transitions로 기본적인 Animation 적용하기 (2) | 2012.06.18 |
비트맵 마스크 사용하기 (2) | 2012.06.02 |
Handling Corona System Events (2) | 2012.05.22 |
Storyboard의 새로 추가된 기능 - 파라미터 전달과 팝업 기능 - (2) | 2012.04.29 |
timer.performWithDelay() 함수에 대해 알아보기 (2) | 2012.04.28 |
Director Class와 Storyboard API 비교 -2- (0) | 2012.04.21 |