September 14, 2021
μ§ννλ κ°μΈ νλ‘μ νΈμΈ Loa-Hands
, Web Chat
λͺ¨λ μΉ μ±μμ μ΄λ ν λ°μμ΄ μκΈ°κ³ λ³κ²½λλ μ 보λ₯Ό μ¬μ©μκ° μ΅λνλκ²μ΄ μ£Ό μ΄λ€.
λλΆλΆμ μ±λ€λ λ§μ°¬κ°μ§κ² μ§λ§, μΉ μ±μ νμ±ν μμΌλκ³ κ³μ κ·Έ νλ©΄λ§ λ³΄λ μ¬μ©μλ€μ μλ€.
λ€λ₯Έ νλμ νλ€κ±°λ, μ μ μ리λ₯Ό λΉμ΄λ€κ±°λ.
κ·Έλμ Loa-Hands
μμ νμ΄λ¨Έλ‘ κ³μ°λκ³ μλ 컨ν
μΈ λ€μ΄ νΉμ μκ°μ λλ¬νλ€κ±°λ Web Chat
μ μλ‘μ΄ λ©μμ§κ° μ λ¬λλ€λ©΄ λ€λ₯Ένλ©΄μ λ³΄κ³ μλ μ¬μ©μμκ² μλ¦Όμ μ λ¬ν μ μμκΉ? λΌλ κ³ λ―Όμ νμλ€.
μ¬μ€ λ€μ΄μΌλ‘κ·Έκ°μ μ»΄ν¬λνΈκ° μμ±λλ€κ³ νλλΌλ, νμ±νλμ΄μλ λΈλΌμ°μ κ° λ€λ₯΄λ€λ©΄ νμΈν μ μκΈ° λλ¬Έμ μ± λ΄λΆμμμ κΈ°λ₯μΌλ‘λ νκ³κ° μμλ€.
μ¦, λΈλΌμ°μ μμ μ 곡νλ Web API
μμ μμλ³Ό νμκ° μμλ€.
λΉμ°ν Web API
μ΄λ€. λλΆλΆμ λΈλΌμ°μ λ€μμ μ 곡λλ κΈ°λ₯μ΄κ³ , chrome
μμλ μ€νμΌλ§ λ κΈ°λ₯λ λͺ¨λμ²λΌ μ 곡νλκ² κ°μλ€.
Notification
μμ±μλ₯Ό ν΅ν΄ μΈν°νμ΄μ€λ₯Ό μμ±ν μ μλ€.
μ¬μ©μμ λΈλΌμ°μ λ₯Ό μ‘°μνλ API
μ΄κΈ° λλ¬Έμ, μ¬μ©μμ κΆνμ΄ λ¨Όμ νμνλ€.
this.requestPermission = async () => {
const permission = await Notification.requestPermission(res => res)
if (permission === 'granted')
return new Notification('μλ¦Όμ΄ νμ©λμμ΅λλ€.')
}
Notification.requestPermission
λ©μλλ₯Ό ν΅ν΄ μ¬μ©μμκ² κΆνμ μμ²νλ μλ¦Όμ΄ κ°λ€.
prompt
μ μ μ¬ν¨
granted
κΆν μΉμΈdennied
κΆν λ―ΈμΉμΈdefault
κΆνμ μμ²ν μ μλ μν2λ²μ dennied
μνλ κΆνμ μμ²ν μ μ‘°μ°¨ μλ€.
λ°λΌμ, λ§μ½ μ¬μ©μμ λΈλΌμ°μ μμ λͺ¨λ μΉ μ±μμμ μμ²μ dennied
ν μνλΌλ©΄, μ¬μ©μκ° κΆνμ default
μνλ‘ λ³κ²½νμ¬μΌλ§ μμ²μ΄ μ λ¬λλκ² κ°μλ€.
κΈ°λ³Έμ μΌλ‘
https
, μΈμ¦μλ‘ μΈμ¦λ μ¬μ΄νΈ μμλ μλ¬Όμ λ₯Ό ν΄λ¦νμ¬ μνλ₯Ό μ νν μ μλ€.
λΉλκΈ°λ‘ μλμ΄ λκΈ° λλ¬Έμ, μ¬μ©μμ μ νμ λ΄κ³ μλ promise
κ°μ²΄λ₯Ό λ°ννλ€.
.then
μΌλ‘ μλ΅ λ°μ΄ν°λ₯Ό λ°μμ μ²λ¦¬νλλ‘ κ³΅λ¬Έμλ λμμμ§λ§,
λΉκ΅μ μ΅μ λ°©μμΈasync await
μΌλ‘ ν΄λ μλμ λλλΌ.
νμ¬ μ¬μ©μμκ² μλ¦Όμ μ λ¬ν μ μλ κΆνμ΄ μ΄λ€ μνμΈμ§ νμΈν΄λ³Ό νμκ° μμ κ²μ΄λ€.
this.checkPermission = () => {
const permission = Notification.permission
if (permission === 'granted') return true
if (permission === 'default') return false
if (permission === 'denied') return false
}
Notification.permission
μΌλ‘ κΆνμ νμΈν΄ λ³Ό μ μμΌλ©°, ν΄λΉ μμ±μ μ€λ‘μ§ μ½κΈ°μ μ©μ΄κΈ° λλ¬Έμ, κ° ν λΉκ³Όκ°μ λ°©μμΌλ‘λ κ°μ λ³κ²½ν μ μλ€.
μ¬μ©μμ κΆν μμμ΄κΈ° λλ¬Έμ, λΉμ°νλ€κ³ λ³Έλ€.
λ§μ½ κΆνμ΄ μΉμΈλμλ€λ©΄, μλμ κ°μ λ°©λ²μΌλ‘ μλ¦Όμ μ λ¬ν μ μλ€.
new Notification('μ λͺ©', { body: 'λ΄μ©' })
첫λ²μ§Έλ‘λ νμ΄ν, λλ²μ§Έλ‘λ μ΅μ
κ°μ²΄λ₯Ό μ λ¬ν μ μλλ°, μ΅μ
κ°μ²΄μλ μΈλΆ λ΄μ©
, μ΄λ―Έμ§
λ±μ μΆκ°ν μ μμλ€.
νμ¬, Loa-Hands
μμλ μλμ κ°μ νλμ μ΄λ²€νΈ μμ±μλ‘ κ΄λ¦¬ν΄μ μ¬μ©ν΄λ³΄μλ€.
μ± νΉμ±μ, λμΌν μκ°μ μ¬λ¬ μλ¦Όμ΄ μ λ¬λ μ μκΈ° λλ¬Έμ, κ·Έλ¬ν μν©μ΄λΌλ©΄ κ°κ°μ μλ¦Όλ€μ que
λ°°μ΄μ μ μ₯ν΄ λμλ€κ°, νΉμ μκ° μ΄λ΄μ μλ‘μ΄ μμ²μ΄ μλ€λ©΄ μΌκ΄ μ²λ¦¬ν΄μ£Όλ λ°©μμ μ¬μ©νμλ€.
export function NotificationHandler(createNotification) {
let notificationWorks = []
let timeout = null
this.requestPermission = async () => {
const permission = await Notification.requestPermission(res => res)
if (permission === 'granted')
return new Notification('μλ¦Όμ΄ νμ©λμμ΅λλ€.')
}
this.checkPermission = () => {
const permission = Notification.permission
if (permission === 'granted') return true
if (permission === 'default') return false
if (permission === 'denied') return false
}
this.removeTimeout = () => clearTimeout(timeout)
this.activeNotification = data => {
// κΆν μΉμΈμνκ° μλλ©΄ μ’
λ£
if (!this.checkPermission()) return
this.removeTimeout()
notificationWorks.push(data)
timeout = setTimeout(() => {
const { title, option } = createNotification(notificationWorks)
notificationWorks = []
}, 300)
}
}
λν μ λ¬νκ² λ μλ¦Όμ λν data
λ€μ κ³μ°νλ λ°©μμ λͺ¨λ λ€λ₯Ό μ μκΈ° λλ¬Έμ, ν¨μλ₯Ό μμ±νκΈ° μ μ λ¬ν΄μ£Όλλ‘ νμλ€.
React
μ νΉμ±μ λ©λͺ¨μ΄μ μ΄μ λμ΄μκΈ° λλ¬Έμ, μ λλ‘notification
μ μ¬μμ±λμ§ μλλ€.
const notification = useMemo(
() => new NotificationHandler(κ³μ° ν¨μ),
[createNotification]
)
μ μλλλμ§ νμΈν΄λ³΄μ
μ¬μ©μμκ² λ¨Όμ κΆνμ μμ²νλ μλ¦Όμ΄ κ°λ€.
λ¨, μ¬μ©μμ κΆν μνκ°
dennied
λΌλ©΄ μμ²μ΄ μ λ¬λμ§ μλλ€.
μμ²μ μΉμΈνκ³ , μμ²μ μΉμΈνλ€λ 첫 μλ¦Όμ΄ μ λ¬λ λͺ¨μ΅μ΄λ€.
νμ΄λ¨Έκ° μ μ©λ 컨ν μΈ μ νΉμ μκ°μ λλ¬νμ, μ¬λ¬ μμ²λ€μ νλλ‘ λ³ν©νμ¬ μλ¦Όμ μ λ¬ν λͺ¨μ΅μ΄λ€.
μμ μν©μμλ μ¬λ¬ μμ²μ νλλ‘ λ³ν©ν΄μ£ΌκΈ° μν΄ 0.3
μ΄λΌλ μκ° λ€μ μλ¦Όμ΄ μ λ¬λλλ‘ νμλ€.
λ§μ½, Web Chat
μ²λΌ μ€μκ°μ΄ μ€μνκ³ , λͺ¨λ μμ²λ€μ΄ κ°κ°μ λ¬λμ΄μΌ νλ€λ©΄?
μΉ΄μΉ΄μ€ν‘μ²λΌ
μλ¦Ό.close.bind(μλ¦Ό)
κΈ°λ³Έμ μΌλ‘ μ λ¬λ μλ¦Όμ λΈλΌμ°μ μμ κΈ°λ³Έμ μΌλ‘ μ€μ ν μκ° μ΄νμ μλμΌλ‘ μ¬λΌμ§λ€.
λ§μ½, μμ²μ΄ μ€μ²©λμ΄μλ€λ©΄ μ¬λΌμ§ λ€μμ λ€μ μμ²μ΄ μλ¦ΌμΌλ‘ μμ±λλ€.
μμ close
λ©μλλ₯Ό μ¬μ©νμ¬ μμ±λ μλ¦Όμ μ¦μ μ¬λΌμ§λλ‘ ν μ μλλ°, μ΄ λ°©λ²μ μ¬μ©νμ¬ μ΄μ μλ¦Όμ νλμ λ³μμ μΊμ±ν΄λκ³ , μλ‘μ΄ μμ²μ΄ λ€μ΄μ¬ λ μ΄μ μλ¦Όμ close
ν΄μ£Όλ λ°©μμΌλ‘ μ²λ¦¬ν΄μ£Όλ©΄ λ κ² κ°λ€.
λΉκ΅μ μ΅κ·Όμλ λΈλΌμ°μ κ° νμ±ν λμ΄μμ§ μλλΌλ, μλ¦Όμ μ λ¬ν΄ μ€ μ μλ Web Push API
κ° μκ²Όλ€κ³ νλ€.
λ§μΉ λͺ¨λ°μΌμ μλ¦Όμ²λΌ
νμ§λ§, ν΄λΉ API
λ IOS
μ κΈ°λ³Έ λΈλΌμ°μ μΈ Safari
μμλ μ 곡νμ§ μκ² λ€κ³ μ μ κ·Έμ API
λΌκ³ νλ€.
λΈλΌμ°μ μμ native
μμλ§ κ΅¬νν μ μλ λ°©λ²λ€μ΄ κ³μ μ겨λκ² λλ©΄ native
κ°λ°μλ€μ μ
μ§κ° μ€μ΄λ€μ§ μμκΉ..? λΌλ μ
μ.. μΆ©λΆν μ΄ν΄κ° κ°λ λ¬Έμ μ΄λ€.