[Feature] APNs 발송 모듈 구현 (Apple Push Notification service) #106

Closed
opened 2026-02-10 06:51:02 +00:00 by seonkyu.kim · 0 comments
Owner

📋 개요

APNs HTTP/2 API를 사용하여 iOS 디바이스에 푸시를 발송하는 모듈을 구현합니다.
PushWorker(#9)의 선행 작업으로, JWT 인증 기반 APNs 발송 및 에러 처리를 포함합니다.

📐 설계

  • Interface: IApnsSender (Application Layer)
  • Implementation: ApnsSender (Infrastructure Layer, HttpClient HTTP/2)
  • JWT(ES256) 토큰 생성 및 캐싱 (50분 갱신)
  • Service별 APNs 설정 관리 (BundleId, KeyId, TeamId, PrivateKey)

체크리스트

Application Layer

  • IApnsSender.cs — APNs 발송 인터페이스

Infrastructure Layer

  • ApnsSender.cs — APNs HTTP/2 연동
  • JWT 토큰 생성 (ES256, .p8 Private Key)
  • Service별 APNs 설정 관리
  • DI 등록

에러 처리

  • APNs 응답 코드별 처리 로직
  • 410 Unregistered → Device 삭제
  • 400 BadDeviceToken → Device 삭제
  • 503/429 → 재시도

검증

  • 빌드 확인 (0 errors, 0 warnings)

📎 참고

  • Milestone: Phase 3 (v0.4.0)
  • PushWorker(#9)가 이 모듈을 사용하여 실제 발송 수행
## 📋 개요 APNs HTTP/2 API를 사용하여 iOS 디바이스에 푸시를 발송하는 모듈을 구현합니다. PushWorker(#9)의 선행 작업으로, JWT 인증 기반 APNs 발송 및 에러 처리를 포함합니다. ## 📐 설계 - Interface: `IApnsSender` (Application Layer) - Implementation: `ApnsSender` (Infrastructure Layer, HttpClient HTTP/2) - JWT(ES256) 토큰 생성 및 캐싱 (50분 갱신) - Service별 APNs 설정 관리 (BundleId, KeyId, TeamId, PrivateKey) ## ✅ 체크리스트 ### Application Layer - [x] `IApnsSender.cs` — APNs 발송 인터페이스 ### Infrastructure Layer - [x] `ApnsSender.cs` — APNs HTTP/2 연동 - [x] JWT 토큰 생성 (ES256, .p8 Private Key) - [x] Service별 APNs 설정 관리 - [x] DI 등록 ### 에러 처리 - [x] APNs 응답 코드별 처리 로직 - [x] 410 Unregistered → Device 삭제 - [x] 400 BadDeviceToken → Device 삭제 - [x] 503/429 → 재시도 ### 검증 - [x] 빌드 확인 (0 errors, 0 warnings) ## 📎 참고 - Milestone: Phase 3 (v0.4.0) - PushWorker(#9)가 이 모듈을 사용하여 실제 발송 수행
seonkyu.kim added the
Priority
Urgent
Status
In Progress
Type
Feature
labels 2026-02-10 06:51:13 +00:00
seonkyu.kim self-assigned this 2026-02-10 06:51:17 +00:00
seonkyu.kim added this to the Phase 3: 메시지 & Push Core milestone 2026-02-10 06:51:18 +00:00
seonkyu.kim added
Status
Done
and removed
Status
In Progress
labels 2026-02-10 07:00:39 +00:00
Sign in to join this conversation.
No description provided.