λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/WWDC

[WWDC20] The Push Notifications primer (APNs / iOS ν‘Έμ‹œ 등둝)

by Danna 2023. 2. 14.
728x90
728x90

ν‘Έμ‹œ μ•Œλ¦Όμ΄ 무엇인지, μ™œ μ‚¬μš©ν•˜λŠ”μ§€ μ„€λͺ…ν•΄μ£Όκ³  앱에 μΆ”κ°€ν•  수 μžˆλŠ” 방법을 μ„€λͺ…ν•΄μ£ΌλŠ” μ˜μƒμ— λŒ€ν•΄ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€!

 

Introducing Push Notification

ν‘Έμ‹œ μ•Œλ¦Όμ˜ κΈ°λŠ₯

  • Engagement : ν‘Έμ‹œ μ•Œλ¦Όμ„ ν†΅ν•΄μ„œ 앱이 μƒν˜Έμž‘μš© ν•  수 μžˆλ‹€.
  • Provide updates : 앱에 μ‹€μ‹œκ°„μœΌλ‘œ μ—…λ°μ΄νŠΈλ₯Ό μ œκ³΅ν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
  • Dynamic experiences : μ•± λ‚΄μ˜ 변경사항이 μžˆμ„ λ•Œ λ‹€μ΄λ‚˜λ―Ήν•œ κ²½ν—˜μ„ 쀄 수 μžˆλ‹€.

ν‘Έμ‹œ μ•Œλ¦Όμ„ μΆ”κ°€ν–ˆμ„ λ•Œ 이점은 무엇이 μžˆμ„μ§€?

  1. Foreground not required : 앱이 항상 ν¬κ·ΈλΌμš΄λ“œμ— μžˆμ„ ν•„μš”κ°€ μ—†λ‹€. ν‘Έμ‹œ μ•Œλ¦Όμ€ μ•±μ˜ μƒνƒœμ™€ 관계없이 μ „λ‹¬λ˜κ³  ν•„μš”ν•œ 경우 μ‹€ν–‰λœλ‹€.
  2. Power efficient : ν‘Έμ‹œ μ•Œλ¦Όμ€ μ „λ ₯을 많이 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  3. Best engagement : 고객과 μ†Œν†΅ν•˜κΈ°μ— 쒋은 창ꡬ

ν‘Έμ‹œ μ•Œλ¦Όμ˜ μ’…λ₯˜λŠ” 두 가지가 μžˆλ‹€.

  1. Alert notifications : μ‹œκ°μ μœΌλ‘œ λ³΄μ—¬μ§€λŠ” 일반적인 ν‘Έμ‹œ μ•Œλ¦Ό, μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•΄μ„œ μƒν˜Έμž‘μš© ν•  수 μžˆλŠ” 값듀을 μ‘°μ •ν•  수 μžˆλ‹€.
  2. Background notifications : μ½˜ν…μΈ λ₯Ό μ΅œμ‹  μƒνƒœλ‘œ μœ μ§€ν•˜κΈ° μœ„ν•΄ 앱이 ν¬κ·ΈλΌμš΄λ“œκ°€ μ•„λ‹ˆλ”λΌλ„ λŸ°νƒ€μž„μ„ μˆ˜μ‹ ν•  수 있게 ν•œλ‹€.

 

Alert notifications

  • Visible alert : μ•±μ˜ 변경사항에 λŒ€ν•΄ λ³΄μ—¬μ§€λŠ” μ•Œλ¦ΌμœΌλ‘œ 전달할 수 μžˆλ‹€.
  • Display new information & Can be interactive : μƒν˜Έ μž‘μš©ν•  수 μžˆλŠ” μƒˆλ‘œμš΄ 정보λ₯Ό μ•Œλ¦¬λŠ”λ° μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. ex 메세지
  • Foreground or background : 앱이 싀행쀑일 ν•„μš”κ°€ μ—†κ³ , μ•±μ˜ μƒνƒœμ— 관계 없이 ν‘œμ‹œλ  수 μžˆλ‹€.
  • Customizable : ν‘Έμ‹œ μ•Œλ¦Όμ˜ λͺ¨μ–‘μ΄λ‚˜ μƒν˜Έ μž‘μš©μ„ μœ„ν•œ κΈ°λŠ₯은 μ»€μŠ€ν„°λ§ˆμ΄μ§• ν•  수 μžˆλ‹€.

 

Implementing Alert notifications

1. register for remote notifications

κ°€μž₯ λ¨Όμ € 해야할일은 Remote notifications 에 등둝해야 ν•˜λŠ” 것이닀. μœ„μ˜ λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ Apple Push Notification system (APNs) 에 λ””λ°”μ΄μŠ€κ°€ λ“±λ‘λ˜κ³ , λ””λ°”μ΄μŠ€ 토큰을 앱에 λ°˜ν™˜ν•œλ‹€. ν‘Έμ‹œ 토큰은 λ””λ°”μ΄μŠ€λ₯Ό μ‹λ³„ν•˜λŠ”λ° μ‚¬μš©λ˜κ³ , ν‘Έμ‹œλ₯Ό λ³΄λ‚΄λŠ” λŒ€μƒμœΌλ‘œ μ§€μ •ν•˜κΈ° μœ„ν•œ κ°’μœΌλ‘œ μ‚¬μš©λœλ‹€.

 

2. declare your AppDelegate a UNUserNotificationCenterDelegate

μœ„μ˜ μ½”λ“œμ—μ„œλŠ” UNUserNotificationCenter 의 delegate λ₯Ό AppDelegate 내에 self 둜 μ§€μ •ν–ˆκΈ° λ•Œλ¬Έμ— AppDelegate κ°€ UNUserNotificationCenterDelegate λ₯Ό μ±„νƒν•œλ‹€κ³  μ„ μ–Έν•΄μ•Ό ν•œλ‹€. delegate 둜 μ§€μ •ν•˜κ³  λ‚˜λ©΄, ν‘Έμ‹œλ₯Ό λˆŒλ €μ„ λ•Œ μ•±μ—κ²Œ μ•Œλ €μ€„ 수 μžˆλ‹€.

 

3. implement Registration callbacks

registerForRemoteNotifications λ©”μ†Œλ“œ 호좜 후에 μœ„ 두가지 λ©”μ†Œλ“œ 쀑 ν•˜λ‚˜μ— λŒ€ν•΄ μ½œλ°±μ„ λ°›λŠ”λ‹€. 

 

μ‹€νŒ¨ν•  경우 μ‹€νŒ¨ μ΄μœ μ™€ ν•¨κ»˜ μœ„μ˜ λ©”μ†Œλ“œκ°€ 호좜되고, 성곡할 경우 μ•„λž˜ λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλœλ‹€.

토큰을 λ°›λŠ”λ° μ„±κ³΅ν–ˆλ‹€λ©΄, λ””λ°”μ΄μŠ€μ— ν‘Έμ‹œ μ•Œλ¦Όμ„ 보낼 수 μžˆλ„λ‘ λ°±μ—”λ“œ ν‘Έμ‹œ μ„œλ²„λ‘œ 전솑해야 ν•œλ‹€.

 

APNs μ—μ„œ μ•±μœΌλ‘œ λ””λ°”μ΄μŠ€ 토큰은 Data 객체둜 μ „λ‹¬λ˜λ―€λ‘œ, μ„œλ²„μ— μ „λ‹¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•΄μ„œ 보내면 λœλ‹€.

Data ν˜•μ‹μ„ 16μ§„μˆ˜ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜κ³  κ²°ν•©ν•œ ν›„, URLQuery 에 μΆ”κ°€ν•΄μ„œ μ„œλ²„λ‘œ μ „μ†‘ν•˜λŠ” μ½”λ“œμ΄λ‹€.

ν‘Έμ‹œλ₯Ό 보내기 μœ„ν•œ λ””λ°”μ΄μŠ€ 토큰을 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜λŠ” λ‘œμ§μ€ μ„œλ²„μ—μ„œ μˆ˜ν–‰ν•˜λ©΄ λœλ‹€.

 

4. ask for notification permissions

κΈ°κΈ°κ°€ ν‘Έμ‹œ μ•Œλ¦Όμ„ μˆ˜μ‹ ν•˜κΈ° 전에, μ•Œλ¦Όμ„ ν‘œμ‹œν•  수 μžˆλ„λ‘ κΆŒν•œμ„ μš”μ²­ν•΄μ•Ό ν•œλ‹€. requestAuthorization λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ•ŒλŸΏ 창이 λœ¬λ‹€.

 

μ‚¬μš©μžκ°€ μˆ˜λ½ν•˜κ±°λ‚˜ κ±°μ ˆν•œ κ²°κ³ΌλŠ” completion handler 둜 μ „λ‹¬λ˜κ³ , κΈ°κΈ° 섀정에 λ°˜μ˜λœλ‹€. ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό μ—°μ†μœΌλ‘œ ν˜ΈμΆœν•˜λ©΄ 창이 ν‘œμ‹œλ˜μ§€ μ•ŠλŠ”λ‹€. requestAuthorization λ©”μ†Œλ“œμ˜ μ˜΅μ…˜μœΌλ‘œ alert, sound, badge 등에 λŒ€ν•œ κΆŒν•œμ„ μš”μ²­ν•  수 μžˆλ‹€.

 

example payload

아보카도 베이컨 버거가 μƒˆλ‘œλ‚˜μ™”μŒμ„ μ•Œλ €μ£ΌλŠ” ν‘Έμ‹œ μ•ŒλžŒμ˜ νŽ˜μ΄λ‘œλ“œλ₯Ό 보면 λ‹€μŒκ³Ό κ°™λ‹€.

  • aps λ”•μ…”λ„ˆλ¦¬ : ν‘Έμ‹œ μ•Œλ¦Όμ„ 기기에 λ Œλ”λ§ν•˜κΈ° μœ„ν•œ 정보듀을 λ‹΄κ³  μžˆλ‹€.
    • alert λ”•μ…”λ„ˆλ¦¬ : ν‘Έμ‹œ μ•Œλ¦Όμ— 보여쀄 title, body λ₯Ό λ‹΄κ³  μžˆλ‹€.
    • sound : μ˜΅μ…”λ„, ν‘Έμ‹œ μ•ŒλžŒμ„ 받을 λ•Œ μ†Œλ¦¬λ₯Ό μž¬μƒν•˜λ €λ©΄ 포함해야 ν•œλ‹€. default 둜 μ λŠ” 경우 κΈ°λ³Έ μ‚¬μš΄λ“œκ°€ μž¬μƒλœλ‹€.
    • badge : μ•± μ•„μ΄μ½˜μ— ν‘œμ‹œλ˜λŠ” κ°’, ν‘Έμ‹œ μ•ŒλžŒμ„ λˆŒλ €μ„ λ•Œ 뱃지λ₯Ό μ‚¬λΌμ§€κ²Œ ν•˜λ €λ©΄ μ½”λ“œλ₯Ό 톡해 0으둜 μ„€μ •ν•΄μ•Ό ν•œλ‹€.
  • aps ν•„λ“œ μ™ΈλΆ€μ—λŠ” μ»€μŠ€ν…€ν•œ 데이터λ₯Ό 전달할 수 μžˆλ‹€.
  • payload key 에 λŒ€ν•΄μ„œλŠ” μ•„λž˜ 링크 μ°Έκ³ 

how to handle a notification payload

ν‘Έμ‹œ μ•Œλ¦Όμ΄ 열릴 λ•Œλ§ˆλ‹€ userNotificationCenterDelegate λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλœλ‹€.

  • 앱에 μ „λ‹¬λ˜λŠ” νŽ˜μ΄λ‘œλ“œλŠ” μ•ŒλžŒ μ½˜ν…μΈ μ˜ userInfo μ†μ„±μ—μ„œ μΆ”μΆœν•  수 μžˆλ‹€.
  • userInfo 데이터λ₯Ό 톡해 λ™μž‘μ„ μˆ˜ν–‰ν•œ ν›„ completionHandler λ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜, 데이터가 μ—†λŠ” κ²½μš°μ—λ„ completionHandler λ₯Ό ν˜ΈμΆœν•΄μ€˜μ„œ ν‘Έμ‹œ μ•Œλ¦Όμ΄ μ—΄λ ΈμŒμ„ μ‹œμŠ€ν…œμ—κ²Œ μ•Œλ €μ€˜μ•Ό ν•œλ‹€.

Background notifications

  • Fetch data in background : ν‘Έμ‹œ μ•Œλ¦Όμ„ 받을 λ•Œ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€.
  • Stay up to date : 앱을 μ‹€ν–‰ν•˜μ§€λŠ” μ•Šμ€ μƒνƒœλ‘œ μ΅œμ‹  μƒνƒœλ‘œ μœ μ§€ν•˜λŠ”λ° μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • Will launch if necessary : μ‹œμŠ€ν…œμ€ 앱을 μ‹€ν–‰ν•˜κ³  λ°±κ·ΈλΌμš΄λ“œ μ—…λ°μ΄νŠΈλ₯Ό μˆ˜ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ λŸ°νƒ€μž„μ„ μ œκ³΅ν•œλ‹€.
  • System managed : λ„ˆλ¬΄ λ§Žμ€ λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…μ„ ν•  수 μ—†κ²Œ μ œν•œλ˜μ–΄ 있고, 배터리 λΆ€μ‘± λ“± μ œμ•½ 쑰건이 μžˆλ‹€λ©΄ λ°±κ·ΈλΌμš΄λ“œ μ—…λ°μ΄νŠΈκ°€ λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

 

λ°±κ·ΈλΌμš΄λ“œ ν‘Έμ‹œλ„ λ§ˆμ°¬κ°€μ§€λ‘œ APNs 에 λ””λ°”μ΄μŠ€ 토큰을 등둝해야 ν•œλ‹€. λ°±μ—”λ“œ μ„œλ²„μ— 토큰을 λ³΄λ‚΄λŠ” μž‘μ—…μ€ λ™μΌν•˜λ‹€.

λ‹€λ§Œ, Appdelegate λ₯Ό UNUserNotificationCenterDelegate 둜 μ§€μ •ν•˜κ±°λ‚˜, UNUserNotificationCenter 에 ν• λ‹Ήν•  ν•„μš”κ°€ μ—†λ‹€.

UNUserNotificationCenterDelegate λŠ” Alert push λ₯Ό μ²˜λ¦¬ν•  λ•Œμ—λ§Œ μ‚¬μš©λœλ‹€.

 

Background notification payload

content-available ν•„λ“œλ§Œ μœ μΌν•˜κ²Œ ν•„μš”ν•˜λ‹€.

ν•΄λ‹Ή ν•„λ“œκ°€ λ°±κ·ΈλΌμš΄λ“œ μ•Œλ¦Όμž„μ„ μ•Œλ €μ£Όκ³ , μ—…λ°μ΄νŠΈλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 앱을 μ‹œμž‘ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ‹œμŠ€ν…œμ—κ²Œ μ•Œλ €μ€€λ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ aps ν•„λ“œ 외에 μ»€μŠ€ν…€ν•œ ν•„λ“œλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.

Handle a background push

ν‘Έμ‹œ μ•Œλ¦Όμ„ μˆ˜μ‹ ν•˜λ©΄ application(didReceiveRemoteNotification) λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλœλ‹€.

alert push 와 λ‹€λ₯΄κ²Œ completionHandler 에 ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜κ°€ μžˆλ‹€. λ°±κ·ΈλΌμš΄λ“œ μ—…λ°μ΄νŠΈκ°€ μ‹€νŒ¨ν–ˆλŠ”μ§€, 데이터λ₯Ό μˆ˜μ‹ ν•˜μ§€ μ•Šμ•˜λŠ”μ§€, μƒˆλ‘œμš΄ 데이터λ₯Ό μˆ˜μ‹ ν–ˆλŠ”μ§€μ— λŒ€ν•΄ μ‹œμŠ€ν…œμ—κ²Œ μ•Œλ €μ£ΌλŠ” enum νƒ€μž…μ΄λ‹€.

  • URL 생성에 μ‹€νŒ¨ν•œ κ²½μš°μ—λ„ completionHandler λ₯Ό ν˜ΈμΆœν•΄μ„œ λ°±κ·ΈλΌμš΄λ“œ μ—…λ°μ΄νŠΈ μ‹€νŒ¨λ₯Ό μ•Œλ €μ€€λ‹€.
  • URL μƒμ„±ν•˜κ³  데이터가 μ—†λ‹€λ©΄ completionHandler λ₯Ό 톡해 데이터가 없이 μ™„λ£Œλ˜μ—ˆμŒμ„ μ•Œλ €μ€€λ‹€.
  • URL 생성 ν›„ 데이터가 정상적일 λ•Œμ— μ—…λ°μ΄νŠΈλœ 메뉴λ₯Ό κ°€μ Έμ˜€κ³  메뉴λ₯Ό μ—…λ°μ΄νŠΈν•œ ν›„, completionHandler λ₯Ό 톡해 μƒˆλ‘œμš΄ 데이터λ₯Ό κ°€μ Έμ™”μŒμ„ μ„±κ³΅ν–ˆμŒμ„ μ•Œλ €μ€€λ‹€.

이제 ν‘Έμ‹œμ— λŒ€ν•΄ λͺ¨λ“ κ±Έ ν•  수 있고, 개발자 에 κ°€μ„œ ν‘Έμ‹œ μ•Œλ¦Όμ„ ν™œμ„±ν™”ν•˜κ³  κ΅¬ν˜„ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€ πŸ™‚

728x90
728x90

'🍎 iOS > WWDC' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[WWDC2017] Love at First Launch  (0) 2023.05.24
[WWDC21] Discover concurrency in SwiftUI  (1) 2023.05.18
[WWDC18] iOS Memory Deep Dive  (2) 2022.11.27
[WWDC19] Advances in Collection View Layout - Part 1  (0) 2022.10.17
[WWDC19] Data Flow Through SwiftUI - Part 2  (0) 2022.08.30