Push notifications - kuimoani/defold GitHub Wiki
Push notifications
μ΄ λ¬Έμλ λΉμ μ κ²μ λλ μ΄ν리μΌμ΄μ μμ λ‘컬 λλ μ격 νΈμ¬ μλ¦Όμ ꡬννκ³ μ€μ νλ λ°©λ²μ λν΄ μ€λͺ ν©λλ€.
νΈμ¬ μλ¦Όμ iOSμ Android μ₯μΉμμ μ¬μ© κ°λ₯νλ©° μ λ°μ΄νΈλ λ³κ²½μ¬νμ νλ μ΄μ΄μκ² μ리λλ° μ¬μ©λ©λλ€. ν΅μ¬ κΈ°λ₯μ iOSμ Androidκ° λΉμ·ν κΈ°λ₯μ κ°μ§κ³ μμ§λ§ νλ«νΌκ° κ³ λ €ν΄μΌν λͺλͺ μ°¨μ΄μ μ΄ μμ΅λλ€.
νΈμ¬ μλ¦Όμ μλ²μμ λμ μ₯μΉλ‘ 보λ΄λ €λ©΄, μ±μ νΉμ μ 보μ λΉνΈ(bits)κ° νμν©λλ€. κ°μ₯ 볡μ‘ν λΆλΆμ 보μ μ λ³΄λ‘ κ΅¬μ±λμ΄ μμΌλ―λ‘ μλ¦Ό μμ€ν μ μλ¦Όμ μμ νλ ν΄λΌμ΄μΈνΈκ° μ λΉνμ§(legitimity)λ₯Ό μΈμ¦ν μ μμ΅λλ€. λν μλ¦Ό μλ²μμ 보μ μ λ³΄κ° νμν μ λ μμ΅λλ€. λ°λΌμ Apple λλ Google μλ²κ° λΉμ μ μλ²κ° μ λΉν μλ¦Ό μ‘μ μ(notification sender)μΈμ§λ₯Ό μΈμ¦ν μλ μμ΅λλ€. λ§μ§λ§μΌλ‘, μλ¦Όμ λ³΄λΌ κ²½μ°, νΉμ μ¬μ©μμ μ₯μΉλ‘ μλ¦Όμ μ§μ μ μΌλ‘ κ³ μ νκ² λ³΄λΌ μ μμ΄μΌ ν©λλ€. μ΄λ₯Ό μν΄ νΉμ λλ°μ΄μ€(μ¬μ©μ)μκ² κ³ μ ν ν ν°μ μ¬μ©νκ±°λ νμν΄μΌ ν©λλ€.
iOS setup
Apple νΈμ¬ μλ¦Ό μλΉμ€(Push Notification Service)μ λν΄ μκ³ μΆλ€λ©΄, Apple μ λ¬Έμλ₯Ό μ½κ³ μλΉμ€κ° μ΄λ»κ² μλνλμ§ λ¨Όμ μμ보λ κ²μ΄ μ’μ΅λλ€. https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html λ₯Ό μ°Έκ³ λ°λλλ€.
iOSμμλ μλ¦Όμ 보λ΄κΈ° μν΄ λ€μ μ λ³΄κ° νμν©λλ€.
- App ID μμ νΈμ¬ μλ¦Όμ νμ±ν ν΄μΌ ν¨
- μ ν¨ν App IDλ₯Ό ν¬ν¨ν νλ‘λΉμ Έλ νλ‘νμΌλ νμν¨
- Apple νΈμ¬ μλ¦Ό μλΉμ€μ SSL μΈμ¦μ(Certificate)κ° μμ΄μΌ Apple μλ²μ μλ¦Ό λ°μ΄ν°λ₯Ό λ³΄λΌ μ μμ
μ΄ λͺ¨λ κ²μ μν΄μλ Apple Developer Member center λ‘ μ΄λν΄μ νΈμ¬ μλ¦Όμ νμ±ν νκΈ° μν AppIλ₯Ό μμ ν΄μΌ ν©λλ€.

λν Apple νΈμ¬ μλ¦Ό μλΉμ€μ SSL μΈμ¦μ(Certificate)λ₯Ό μμ±ν΄μΌ ν©λλ€.

νΈμ¬ μλ¦Όμ λ³΄λΌ μλ²μλ μΈμ¦μκ° νμν©λλ€. κ°λ° μ€μλ μΈμ¦μλ₯Ό λ€μ΄λ‘λ, μ€μΉνκ³ APNS-Pusher λλ NWPusher κ³Ό κ°μ νΈμ¬ ν μ€νΈ μ±μ μ€νν΄ λ³Ό μ μμ΅λλ€.
AppIDμμ μ νλ‘λΉμ Έλ νλ‘νμΌμ μμ±νκ³ λΉμ μ μ₯μΉμ λ£λ μμ μ ν΄μΌ ν©λλ€. Xcodeλ₯Ό ν΅νκ±°λ "Member Center" νμ΄μ§μμ μ§μ μνν μ μμ΅λλ€.

Appleμ μλλ°μ€ μλ²κ° μ λ°μ΄νΈ λλ λμ μκ°μ΄ 걸리λ―λ‘ νΈμ¬ μμ μ΄ μ¦μ λμνμ§ μμ μ μμ΅λλ€.
μ΄μ λͺ κ°μ§ ν μ€νΈ μ½λλ₯Ό μ€νν΄ λ΄ μλ€.
local function push_listener(self, payload, origin)
-- νμ΄λ‘λ(payload)κ° λμ°©ν¨
pprint(payload)
end
function init(self)
local sysinfo = sys.get_sys_info()
if sysinfo.system_name == "Android" then
msg.post("#", "push_android")
elseif sysinfo.system_name == "iPhone OS" then
msg.post("#", "push_ios")
end
end
function on_message(self, message_id, message)
if message_id == hash("push_ios") then
local alerts = {push.NOTIFICATION_BADGE, push.NOTIFICATION_SOUND, push.NOTIFICATION_ALERT}
push.register(alerts, function (self, token, error)
if token then
local t = ""
for i = 1,#token do
t = t .. string.format("%02x", string.byte(token, i))
end
-- device token μΆλ ₯
print(t)
else
-- Error
print(error.error)
end
end)
push.set_listener(push_listener)
elseif message_id == hash("push_android") then
push.register(nil, function (self, token, error)
if token then
-- device token μΆλ ₯
print(token)
else
-- Error
print(error.error)
end
end)
push.set_listener(push_listener)
end
end
λͺ¨λ μ λμνλ©΄ μλ¦Ό 리μ€λ(notification listener)κ° λ±λ‘λκ³ μ¬μ©ν μ μλ ν ν°(token)μ μ»κ² λ©λλ€.
DEBUG:SCRIPT: 1f8ba7869b84b10df69a07aa623cd7f55f62bca22cef61b51fedac643ec61ad8
νΈμ¬ ν μ€νΈ μ±μ μ€νμ€μΈ κ²½μ°, device tokenκ³Ό APN service SSL certificateμ μ¬μ©νμ¬ λΉμ μ μ₯μΉμ μλ¦Όμ λ³΄λ΄ λ³΄λλ‘ ν©λλ€.

μλ¦Όμ ν μ€νΈ μ΄ν리μΌμ΄μ λ΄μμ push_listener() ν¨μμ λλ¬ν ν μ¦μ ν΄λΌμ΄μΈνΈμ λμ°©ν΄μΌ ν©λλ€.
DEBUG:SCRIPT:
{
aps = {
badge = 42,
alert = Testing.. (1),
sound = default,
}
}
κ·Έλ¬λ©΄ iOS ν νλ©΄μμ μλμ κ°μ΄ λνλ©λλ€.

μ΄ν리μΌμ΄μ λ΄μμ λ±μ§ κ°μ(badge count)λ₯Ό μ λ°μ΄νΈ νλ €λ©΄, push.set_badge_count() ν¨μλ₯Ό μ¬μ©νμκΈ° λ°λλλ€.
Android setup
Google μ Google Cloud Messaging μ λν νλμ λ¬Έμλ₯Ό κ°μ§κ³ μμ΅λλ€. https://developers.google.com/cloud-messaging/gcm λΆν° μ½μ΄ 보μκΈ° λ°λλλ€.
Androidμμλ μλ¦Όμ 보λ΄λ €λ©΄ μλμ κ°μ μ λ³΄κ° νμν©λλ€.
- μ΄ν리μΌμ΄μ μ λ΄μ₯λλ GCM Sender ID
- Google μλ²λ₯Ό ν΅ν΄ μλ¦Ό μ μ‘μ νμ±ν νκΈ° μν Server API Key
μ΄ μ€μ μ λ§€μ° κ°λ¨νλ©° http://developers.google.com μμ "Android"λ₯Ό ν΄λ¦ ν "Google Cloud Messaging" νλͺ©μ μ°Έκ³ νμ¬ μμν μ μμ΅λλ€.

νμ΄μ§ νλ¨μλ "Get a configuration file" μ΄λΌλ λ²νΌμ΄ μμ΅λλ€.

μ΄ λ²νΌμ ν΄λ¦νκ³ λ€μ μμλ₯Ό λ°λΌνλ©΄ λ§μ§λ§μ Server API Key μ Sender ID λ₯Ό νλν μ μμ΅λλ€.

Sender ID λ₯Ό 볡μ¬ν΄μ Defold νλ‘μ νΈ μ ν μ gcm_sender_id νλμ λΆμ¬λ£κΈ° ν©λλ€.

μ΄μ ν΄λΌμ΄μΈνΈμ λͺ¨λ μ€λΉκ° λλ¬μ΅λλ€. μμ μ½λ μμ λ Androidμμλ μ λμνλ―λ‘ μ΄λ₯Ό μ€ννκ³ device token idλ₯Ό 볡μ¬ν΄ λ‘λλ€.
DEBUG:SCRIPT: APA91bHkcKm0QHAMUCEQ_Dlpq2gzset6vh0cz46kDDV6230C5rFivyWZMCxGXcjxRDKg1PK4z1kWg3xnUVqSDiO_4_RiG8b8HeYJfaoW1ho4ukWYXjq5RE0Sy-JTyrhqRusUP_BxRTcE
μ΄μ μ°λ¦¬κ° νμν μ 보λ λͺ¨λ μ»μμ΅λλ€. Googleμ μλ¦Όμ Web API λ₯Ό ν΅ν΄ μ μ‘λλ―λ‘ curl μ μ¬μ©νμ¬ ν μ€νΈ λ©μΈμ§λ₯Ό μ μ‘ν μ μμ΅λλ€.
$ curl -X POST -H "Content-type: application/json" -H 'Authorization: key=SERVER_KEY' -d '{"registration_ids" : ["TOKEN_ID"], "data": {"alert": "Hello"}}' https://android.googleapis.com/gcm/send
SERVER_KEY κ³Ό TOKEN_ID λ₯Ό λΉμ μ΄ λ°μ ν€λ‘ λ°κΏμ μ€ννμΈμ.
Local push notifications
μ격 μλ¦Ό λΏλ§μλλΌ λ‘컬 νΈμ¬ μλ¦Όλ μ§μλ©λλ€. μ½κ°μ μ€μ μΌλ‘ λ‘컬 μλ¦Όμ μ€μΌμ₯΄λ§ ν μ μμ΅λλ€.
-- 3μ΄ λ΄λ‘ λ‘컬 νΈμ¬ μ€μΌμ€
local payload = '{"data" : {"field" : "Some value", "field2" : "Other value"}}'
id, err = push.schedule(3, "A notification!", "Hello there", payload, { action = "get going" })
μ΄ idλ μμ½λ μλ¦Όμ κ³ μ νκ² μλ³νκ³ λμ€μ μ μ₯λ μ μμ΅λλ€. push.schedule() μ λ§μ§λ§ νλΌλ©ν°λ νλ«νΌλ³ μ€μ μ ν¬ν¨νκ³ μλ ν μ΄λΈμ λλ€.
action
(iOS μ μ©) "slide to unlock(λ°μ΄μ μ κΈν΄μ )" ν μ€νΈμ "unlock(μ κΈν΄μ )"λ₯Ό κ΅μ²΄νλ μΈλ½ μ¬λΌμ΄λ(unlock slider)μ κ° λλ μΌλΏ(alert)μ μ€λ₯Έμͺ½ λ²νΌμ νμ΄νλ‘ μ¬μ©λλ μΌλΏ μ‘μ λ¬Έμμ΄(alert action string)
badge_count
(iOS μ μ©) λ±μ§ μμ΄μ½(icon badge)μ μ«μ κ°. λ±μ§λ₯Ό μμ νλ €λ©΄ 0μΌλ‘ μ€μ
priority
(Android μ μ©) μ°μ μμ(priority)λ μλ¦Όμ νμνλ λ°©λ²μ λν΄ μ₯μΉ UIμ μλ €μ£Όλ ννΈμ λλ€. μ¬κΈ°μ -2 ~ 2 μ¬μ΄μ κ°μΌλ‘ 5λ¨κ³μ μ°μ μμ λ λ²¨μ΄ μμ΅λλ€. νΉλ³ν μ§μ νμ§ μμΌλ©΄ 2λ₯Ό κΈ°λ³Έ μ°μ μμ λ¨κ³λ‘ μ¬μ©ν©λλ€.
Inspecting scheduled notifications
API λ νμ¬ μ€μΌμ₯΄λ μλ¦Όμ κ²μ¬νκΈ° μν λ κ°μ§ ν¨μλ₯Ό μ 곡ν©λλ€.
n = push.get_scheduled(id)
pprint(n)
idλ‘ μ€μΌμ₯΄λ μλ¦Όμ μμΈ μ 보λ₯Ό ν¬ν¨νλ ν μ΄λΈμ 리ν΄ν©λλ€.
DEBUG:SCRIPT:
{
payload = {"data":{"field":"Some value","field2":"Other value"}},
title = A notification!,
priority = 2,
seconds = 19.991938,
message = Hello there,
}
seconds λ μλ¦Όμ΄ μμλλλ° λ¨μ μκ°(μ΄)λ₯Ό λνλ λλ€. λν μ 체 μλ¦Ό μ€μΌμ₯΄μ ν¬ν¨ν ν μ΄λΈμ νμνλ κ²λ κ°λ₯ν©λλ€.
all_n = push.get_all_scheduled()
pprint(all_n)
μλ¦Ό idλ‘ λμ΄λ λ°μ΄ν°λ₯Ό ν¬ν¨νλ ν μ΄λΈμ λ°νν©λλ€.
DEBUG:SCRIPT:
{
0 = {
payload = {"data":{"field":"Some value","field2":"Other value"}},
title = A notification!,
priority = 2,
seconds = 6.009774,
message = Hey hey,
}
1 = {
payload = {"data":{"field":"Some value","field2":"Other value"}},
title = Another notification!,
priority = 2,
seconds = 12.652521,
message = Hello there,
}
2 = {
payload = {"data":{"field":"Some value","field2":"Other value"}},
title = Hey, much notification!,
priority = 2,
seconds = 15.553719,
message = Please answer!,
}
}