# Untitled

[출시 후 Push Notification 적용]

**Push Notification**

- 앱이 InActive 상태가 아니더라도 확인할 수 있는 알림의 일종

- 개발자가 보내는 타이밍, 메시지 등을 미리 지정해서 코드로 빌드해둔 로컬 알림과 다르게

    - 서버를 통해서 매번 다른 시간, 다른 내용으로 알림을 보내도록 APNs에 요청을 보낸다.

- 로컬/푸시 알림 모두 사용자의 권한 확보가 가장 중요하다.

**Firebase Cloud Messaging 서비스로 Push 보내기**

1. 결국에는 APNs를 거쳐야 하기 때문에, XCode 프로젝트에서 Push Notification을 지정해줘야 한다. (유료 계정!)

+ background 상태에서도 앱이 노티를 받아야 하기 때문에 background 설정까지 넣어준다.

2. Push 사용을 위한 인증키를 발급 받는다.

developer.apple.com > 식별자 > key 발급 (.p8 형식의 보안 파일)

- .p8 파일의 경우 만료 기한이 정해져 있지 않고, .p12 형태의 인증서 파일 인증서의 유효기간이 정해져 있다.

- .p12 인증서는 개발용/배포용 구분이 되어 있고, 개별 앱마다 인증서 발급이 필요하다.

- .p8의 경우는 하나의 인증키로 여러 앱에 적용이 가능하다.

3. XCode 프로젝트 패키지에 firebase-messaging을 추가해준다.

4. Firebase 콘솔에서 푸시를 보낼 앱 공간을 만들어서 서버를 구축한다. (google-info.plist 삽입까지 완료하자)

- firebase 프로젝트 설정 상에 다운로드 받은 .p8 인증키를 등록한다.

- iOS 클라이언트에 대한 [Firebase의 공식 문서](https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ko&authuser=0&_gl=1*13sh2tq*_up*MQ..*_ga*Njk0NDE3MjkuMTcyODI2NDY0Ng..*_ga_CW55HF8NVT*MTcyODI2NDY0Ni4xLjEuMTcyODI2NTAzMy4zOC4wLjA.)대로 초기 코드를 세팅한다.

5. AppDelegate 단에서 디바이스-콘솔에 따른 토큰 갱신 로직을 잘 구성한다.

6. Firebase 콘솔에서 Cloud Messaging 메뉴로 들어와 알림 메시지 캠페인 설정으로 초기 테스트를 진행해본다. 

- AppDelegate에서 조회한 토큰 데이터를 가지고 있어야 한다.

**Push Notification을 위한 토큰 인증 방식**

1. 앱이 설치된 개별 디바이스별로 고유한 token 값을 가진다. 이를 APNs에 인증을 확인한다.

2. APNs에서는 토큰에 대한 유효성을 검증해주고 (response로 전달)

```javascript
func application(application: UIApplication,
                    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  // APNs에서 발급해주는 기기별 토큰 값
  Messaging.messaging().apnsToken = deviceToken
}
```

3. 응답 받은 유효성 검증 내역을 앱에 등록해둔 Firebase SDK 코드로 Firebase 서버에 토큰 값을 가지게 된다. (서버 유저값과 토큰 맵핑)

```javascript
// fcm 자체적으로 맵핑한 토큰 값을 기기에 다시 전달
// 이 fcm 토큰값을 프로젝트 내에서 활용해서 코드 작성 필요
didReceiveRegistrationToken fcmToken: String?
```

4. 이후 콘솔에서 등록된 푸시 알림 캠페인에 맞게 고유한 토큰 값으로 푸시를 보내는 요청을 APNs에 하게 되고 (Firebase → APNs)

5. APNs에서는 토큰 값 비교를 통해 유효한 토큰의 디바이스에 푸시를 보내게 된다.

iOS의 푸시 알림

- 알림이 잘 전달되었고, 수신했는지는 확인이 불가하다.

    - 사용자가 푸시를 터치했다면 확인이 가능 (코드로 연결할 수 있음)

- 알림 터치에 따른 화면 전환 분기 처리를 잘 해주어야 한다.

    - window의 rootView가 어떻게 되는지를 잘 확인해야겠지?

- 푸시 알림은 Foreground에서 수신이 default가 아니다. 

    - background 수신이 default 

    - foreground라면 따로 설정을 코드로 해주어야 하고, 로컬 알림을 쓰는게 맞다.

- 기기별 토큰이 다르기 때문에 동일 계정이라면 어떻게 멀티 토큰을 관리할 지 잘 고려해야 한다.

    - 앱을 삭제하면 토큰 값이 변경됨

    - 로그아웃은 괜찮음 

![Image](https://upload.cafenono.com/image/slashpagePost/20241007/101317_GoD50gF0aZ6FerBUsW?q=80&s=1280x180&t=outside&f=webp)

For the site tree, see the [root Markdown](https://slashpage.com/hankyeol.md).
