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 implement apple token based push notifications (using p8 file) in C#?

For an app with some kind of chat based features I want to add push notification support for receiving new messages. What I want to do is use the new token based authentication (.p8 file) from Appl...

stackoverflow.com

>> 참조: How to use APNs Auth Key (.p8 file) in C#?

 

How to use APNs Auth Key (.p8 file) in C#?

I'm trying to send push notifications to iOS devices, using token-based authentication. As required, I generated an APNs Auth Key in Apple's Dev Portal, and downloaded it (it's a file with p8 exte...

stackoverflow.com

나는 위 부실한 참조 사이트(그나마 쓸 만한)들만 보고 꾸역꾸역 HTTP/2 송신 프로그램을 다 만들었었다. (에혀 내 팔자야...)

 

그런데, 이제는 APNs를 직접 호출하는 대신,

FCM 서버에 P8 인증키를 등록한 뒤 FCM만 호출하면 되기 때문에 엄청 편리해졌다.

 

 

 

그런데!

원래도 그랬지만 GCM/FCM와 APNs는 비슷한 듯 하면서도 좀 다르게 동작하는 통에

제대로 된 메시지를 보내서 제대로 Push 알림을 주기가 쉽지 않았다.

(메시지 송수신 프로토콜을 완전히 다 이해하고 작업하는 사람이 있다면 몰라도...)

 

바로 Background 처리 부분에서 특히! 말이다.

Background란, 앱이 종료되거나 Home키 등을 눌러 내려가 있어 직접 메시지를 받을 수 없는 상태를 말하는데

이 때 Push 메시지를 받을 수 있게 하려면 메시지를 보낼 때 조금 더 신경을 써야 한다.

즉, 클라이언트에서도 당연히 Background 메시지를 받을 수 있도록 설정해야 하지만

서버에서도 특별한 메시지를 보내야 처리된다는 얘기다.

(클라이언트에서 처리할 부분은 여기서는 생략한다. 구글링해보면 바로 나오니까.)

 

 

먼저, APNs로 메시지를 보낼 때 참조할 만한 애플 사이트 공식 링크부터 먼저 보자.

>> 참조: Sending Notification Requests to APNs

 

Sending Notification Requests to APNs | Apple Developer Documentation

Article Sending Notification Requests to APNs Send your remote notification payload and device token information to APNs. OverviewWhen you have a notification to send to a user, your provider must construct a POST request and send it to APNs. Your request

developer.apple.com

잘 읽어보면 무엇을 어떻게 해야 하는지 다 나와 있긴 하지만, 좀 두루뭉술하고 애매하게 표현되어 있다.

 

 

 

이번에는 다른 글.

 

>> 참조: Creating the Remote Notification Payload

 

Local and Remote Notification Programming Guide: Creating the Remote Notification Payload

Local and Remote Notification Programming Guide

developer.apple.com

여기 중간 아래 부분을 보면, 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

 

How to handle notification when app in background in Firebase

Here is my manifest

stackoverflow.com

채택된 답변에 상세하게 나와 있다.

한 마디로 요약하면 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 메시지만 보내서 처리하도록 하는 것이 좋다.

 



Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]