PushSharp 관련 글을 5년에 걸쳐서 세 번째 쓰고 있다.
최근에 Apple iOS 단말들의 FCM 지원이 완전해지면서 더 이상 APNs를 직접 호출해서 쓸 필요가 없어지긴 했다.
즉, APNs에서 요구하는 HTTP/2와 P8 인증키 방식을 직접 사용할 필요가 없어졌다는 의미.
사실, APNs HTTP/2 방식 호출을 PushSharp을 이용해서 구현하려면 꽤 까다롭고 복잡하다. PushSharp이 HTTP/2 방식 호출을 지원하고 있지 않기 때문에 직접 코드를 작성해야 하는데, 하다 보면 기존에 쓰고 있던 .NET Framework도 4.6 이상으로 올려야 하고 WinHttpHandler를 확장해서 강제로 Version을 2.0으로 설정하는 등의 처리를 다 해주어야 한다. >> 참조: How to implement apple token based push notifications (using p8 file) in C#? >> 참조: How to use APNs Auth Key (.p8 file) in C#? 나는 위 부실한 참조 사이트(그나마 쓸 만한)들만 보고 꾸역꾸역 HTTP/2 송신 프로그램을 다 만들었었다. (에혀 내 팔자야...) |
그런데, 이제는 APNs를 직접 호출하는 대신,
FCM 서버에 P8 인증키를 등록한 뒤 FCM만 호출하면 되기 때문에 엄청 편리해졌다.
그런데!
원래도 그랬지만 GCM/FCM와 APNs는 비슷한 듯 하면서도 좀 다르게 동작하는 통에
제대로 된 메시지를 보내서 제대로 Push 알림을 주기가 쉽지 않았다.
(메시지 송수신 프로토콜을 완전히 다 이해하고 작업하는 사람이 있다면 몰라도...)
바로 Background 처리 부분에서 특히! 말이다.
Background란, 앱이 종료되거나 Home키 등을 눌러 내려가 있어 직접 메시지를 받을 수 없는 상태를 말하는데
이 때 Push 메시지를 받을 수 있게 하려면 메시지를 보낼 때 조금 더 신경을 써야 한다.
즉, 클라이언트에서도 당연히 Background 메시지를 받을 수 있도록 설정해야 하지만
서버에서도 특별한 메시지를 보내야 처리된다는 얘기다.
(클라이언트에서 처리할 부분은 여기서는 생략한다. 구글링해보면 바로 나오니까.)
먼저, APNs로 메시지를 보낼 때 참조할 만한 애플 사이트 공식 링크부터 먼저 보자.
>> 참조: Sending Notification Requests to APNs
잘 읽어보면 무엇을 어떻게 해야 하는지 다 나와 있긴 하지만, 좀 두루뭉술하고 애매하게 표현되어 있다.
이번에는 다른 글.
>> 참조: Creating the Remote Notification Payload
여기 중간 아래 부분을 보면, content-available에 대한 내용이 상세하게 나와 있다.
바로 그거다.
content-available 값을 제대로 설정해 줘야 Background 상태에서도 Push 알림 처리가 된다는 얘기다.
PushSharp 코드에서는 다행히도 직접 설정값을 쓰거나 할 필요 없이
Push GcmNotification 클래스 인스턴스에 정의되어 있는 ContentAvailable 속성을 true로 해 주기만 하면 된다.
다음은, FCM에서의 Background 처리.
구글 공식 문서에서는 아무리 찾아봐도 비슷한 내용을 찾기 어렵다.
그나마 발견한 것은 역시 요즘 기술 문서 검색 결과의 95% 이상을 차지하는 StackOverflow.
>> 참조: How to handle notification when app in background in Firebase
채택된 답변에 상세하게 나와 있다.
한 마디로 요약하면 Notification 메시지 외에 Data 메시지를 추가로 전달해 줘야 한다는 것.
PushSharp 코드 기준으로는 아래와 같다.
_gPushBroker.QueueNotification(new GcmNotification()
{
RegistrationIds = targetPushIDs,
Notification = JObject.Parse(notificationJson),
Data = JObject.Parse(dataJson)
});
혹시 notificationJson 하나만으로 전송하고 있었다면 dataJson을 분리해서 두 가지 메시지로 전송하면 된다.
그럼, 위 APNs와 FCM 두 가지를 FCM 송신 메시지 하나에서 동시에 처리하려면?
두 가지를 다 처리해 주면 된다. 아래와 같이.
_gPushBroker.QueueNotification(new GcmNotification()
{
RegistrationIds = targetPushIDs,
Notification = JObject.Parse(notificationJson),
Data = JObject.Parse(dataJson),
ContentAvailable = true
});
끝.
+추가(2019-05-18). Android에서는 앱이 백그라운드로 내려가 있거나 혹은 종료되어 있을 때 Push를 받으면 Notification 메시지가 있는 경우 Data 메시지를 무시한다(버그?). 따라서 꼭 필요한 경우가 아니라면 Data 메시지만 보내서 처리하도록 하는 것이 좋다. |
'Tech: > .NET·C#' 카테고리의 다른 글
Stream 사용 시 기본 유의사항을 또 까먹고... (0) | 2020.12.24 |
---|---|
ASP.NET Core Html Helper? Tag Helper! (0) | 2020.12.08 |
VS2017 환경과 .NET Framework 4.7.1 타기팅 팩 (0) | 2019.05.10 |
web.config의 customErrors/httpErrors (0) | 2018.08.17 |
ASP.NET MVC와 razor 코드의 무리수 (1) | 2018.07.12 |