푸시 받기
앱 쪽 푸시. 권한은 한 번만 묻고, 네이티브 토큰(APNs · FCM)을 서버에 등록 · 해제하며, 토큰이 바뀌면 다시 등록하고, 알림을 눌러 연 data 를 화면 하나로 읽는다(꺼진 앱을 켠 경우 포함). 보내는 쪽은 푸시 유닛이다. expo-notifications 는 소비 앱이 넣는다
npm install @duolabs-deux/unit-push-receive
직접 넣어 보기
기기
처음 권한
누른 알림 data
→ 스레드 화면 /project/thread/t9?projectId=p1
routes: thread(projectId, threadId) · project(projectId). 값은 문자열만 읽는다
어댑터
| id | 종류 | 설명 |
|---|---|---|
expo | 실제 | 소비 앱이 expo-notifications 를 주입한다(createExpoNotificationsEngine). 네이티브 토큰을 쓰고 Expo 중계를 거치지 않는다 |
fake | 가짜 | 기기 없이 결정적으로 답한다. 권한 · 토큰 · 꺼진 앱의 알림을 옵션으로 정하고, rotateToken · tap 으로 토큰 교체와 누르기를 흉내 낸다 |
실패와 소비 앱이 할 일
| 종류 | 언제 | 할 일 |
|---|---|---|
upstream-down | 서버 등록 · 해제 호출(server.register · unregister)이 던졌을 때 | 삼키고 다음 sync 때 다시 등록한다. 알림 때문에 앱 사용을 막지 않는다 |
unexpected | 엔진이 권한을 읽거나 묻다가 예외를 던졌을 때 | 알림 설정 화면에 「다시 시도」를 둔다 |
한도
- 권한이 없거나 토큰을 못 받으면 오류가 아니라 skipped 다. 앱 사용을 막지 않는다
- 거절한 뒤 다시 물으면 iOS 는 창 없이 거절을 돌려준다. 설정 앱으로 보내는 것은 소비 앱의 몫이다
- Android 13+ 는 알림 채널이 하나라도 있어야 권한 창이 뜬다. 채널 id 는 서버 FCM 메시지의 channelId 와 같아야 한다
- 알림 data 는 문자열만 읽는다(FCM data 는 문자열만 실린다). 모르는 type 은 열지 않는다