최근 프로젝트에서 푸시 알림을 커뮤니케이션 알림 형태로 보여주는 기능을 개발하게 되었다.
처음에는 fcm 관련 플러터 플러그인을 사용하면 될줄 알았는데 아직 커뮤니케이션 알림 기능을 제공하는 플러그인은 없어서 aos,ios둘다 네이티브로 구현했어야했다. 내가 ios 담당이었다.
iOS 15 이상에서는 AppDelegate에서 userNotificationCenter함수를 오버라이드 하여 앱이 포그라운드에 있을 때 커뮤니케이션 알림을 구현할 수 있지만, 백그라운드나 앱 종료 상태에서는 Notification Service Extension이 필수적이라는 것을 알게 되었다.
Notification Service Extension을 구현하고, 푸시를 보내고, 기다리고, 또 기다렸다. 하지만 뭘 어떻게 해도 이 함수가 작동되지 않았다. 마치 깊은 늪에 빠진 듯 했다.
며칠 동안 셀수없는 시간을 쏟아부으며 다음과 같은 부분들을 샅샅이 뒤졌다.
Notification Service Extension not called로 검색해서 나온 글을 진짜 많이 읽고 적용했는데도 전혀 작동되지 않았다. 앱을 껏다 키기, target runner과 target Notification Service Extension의 빌드 버전 맞추기, Notification Service Extension을 삭제하고 다시 추가해보기 등등.. 전혀 되는게 없었다.
서버에서 페이로드를 잘못 보내주나 싶어서 서버한테도 몇번이나 이렇게, 저렇게 해달라고 부탁했는데 달라지는건 없었다.
결국 Xcode에서 Notification Service Extension Scheme을 선택하고 직접 실행하여 로그를 확인해보려 했지만, 로그 분석 능력의 부족으로 정확한 문제 원인을 파악하지 못했다. 시간은 계속 흘러갔고, 압박감은 커져만 갔다. (로그가 아예 찍히지가 않았다. 타겟을 Notification Service Extension으로 바꾸고 PID를 설정해라 해서 했는데도 안됐다.)
결국, 나는 눈물을 머금고 포기를 선언했다. 회사의 실망은 불 보듯 뻔하지만, 더 이상 버틸 수 없었다.
비록 성공하지는 못했지만, 이 뼈아픈 경험을 통해 다음과 같은 교훈을 얻었다.
iOS 개발, 특히 푸시 알림 관련 기능은 정말 어렵다.
문제 해결 능력과 로그 분석 능력을 키워야 한다.
때로는 포기도 용기가 될 수 있다.
페이로드 예시 (혹시 누군가에게 도움이 될지도...)
{
"registration_ids": [
"디바이스 토큰"
],
"notification": {
"title": "알림 제목",
"body": "알림 내용"
},
"apns": {
"payload": {
"aps": {
"mutable-content": 1,
"alert": {
"title": "알림 제목",
"body": "알림 내용"
},
"data": {
"character_profile_lk": "캐릭터 이미지 URL",
"character_nm": "캐릭터 이름",
"character_se": "캐릭터 식별자",
"image_lk": "이미지 URL",
// ... 기타 필요한 데이터
}
}
}
}
}
이 글이 나와 같은 삽질을 겪는 iOS 개발자들에게 작은 위로가 되기를 바란다.
그리고 혹시 이 글을 읽는 능력자분이 계시다면, 제가 놓친 부분이 무엇인지 댓글로 알려주시면 감사하겠습니다... 😥
포그라운드일때 되었던 코드 : https://pub.dev/packages/ios_communication_notification
Notification Service Extension 참고 코드 : https://stackoverflow.com/questions/71196442/how-to-set-a-custom-icon-to-an-ios-push-notification
로그가 안찍히는건 익스텐션을 타지도 않기 때문임!