배경 : FCM 푸시 메세지 발송 관련 구 API가 2024년 6월 20일 -> 7월 20일 deprecated 됨에 따라, 신규 API (http v1) 으로 변경 하는 과정에서 배운점 정리 (도움주신 cks, jdh 감사합니다)
내용 :
0. 공통
FCM 푸시 마이그레이션 공식 가이드 사이트
- 위 가이드 대로 그대로 하면 뭐 되는게 없었다.
특히 내가 운영하는 앱 푸시의 경우는 푸시 발송요청하면 squid 라는 푸시 전용 proxy 서버를 거쳐서 FCM 서버로 전송되게 있어서 일반적인 서버 소스상으로는 전송이 안됬고,
proxy 서버에 요청한다는 서버상 셋팅값이 필요했다.
특히 금번 개발시, 내가 놓쳤던 부분은 oAuth2 서버에서 토큰값을 받아와야하는데. 그 요청을 할때 역시 proxy 셋팅을 해주고, 프록시 서버 내 해당 url 허용요청을 했어야만 정상 동작했다.
pushProxyHost : 접속 도메인 주소
pushPort : 3128 (squid 프록시 서버에서 사용하는 전용포트)
커넥션 할때, getAccessToken 불러올때 모두 아래 셋팅 필요함
System.setProperty("proxySet", "true");
Proxy webProxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(pushProxyHost, pushProxyPort));
HttpURLConnection conn = (HttpURLConnection) url.openConnection(webProxy);
1. Android
1) 백그라운드 상태에서 푸시 와서 클릭시 앱 실행되지 않는 현상
Data & Notification를 보내는 경우
{
"data":{
"title": "data title text",
"body": "data body text",
"link": "http://m.naver.com"
},
"notification": {
"title": "notification title text",
"body": "notification body text",
"link": "http://m.naver.com"
}
}
앱이 Background 상태거나, Killed 상태 일때는, Notification 이 시스템 트레이를 통해 기기에 표시되고, onMessageReceived를 통해 Data는 전달 되지 않는다.
그래서 앱이 Background 상태거나, Killed 상태에서 Data & Notification Push 일 경우에는 Data 처리는 할 수 없다.
위에 설명한 내용은 여기에 잘 정리되어 있다.
https://firebase.google.com/docs/cloud-messaging/android/receive?hl=ko
출처: https://bacassf.tistory.com/119 [코딩하는 일용직 노동자:티스토리]
2) Data 영역은 커스텀데이터 전달 영역임. 커스텀 데이터 영역내 key, value 값으로 전송을 하는데, value 값을 JsonObject 형태로 인식 못함을 체크하자
3) 푸시 클릭시 상세 페이지를 진입하기 위해서는 푸시메세지 전송시 url, 또는 subUrl 등의 접속 url을 같이 넘겨야한다.
4) 내가 보낸 샘플 Json 양식 샘플 및 뉴버전 json 방식 예제 설명
- 맨 상단은 message 로 감싸서 보낸다.
- message 하단 에 보낼 데이터는 token (폰 기기정보), data (푸시에 필요한 커스텀 데이터), apns (iOS용)으로 나누어 보낸다.
- data 형역에 추가 2depth 형태로 jsonData 형태로는 보내지 못한다. 아래 예시에서 openActivity 처럼 묶어서 보낼 일이 생길 경우는 value 영역을 jsonToSting 으로 변환하여 요청한다.
- iOS 백그라운드, 포그라운드 푸시 관련 해결을 위해 mutable-content, content-available 는 1로 셋팅하여 전송한다. (1은 string이면 안됨. int 로)
- data 값 보낼때 badge 값을 입력하지 않고 전송했더니 "badge" : "null" 이라고 null 이라는 스트링으로 강제로 보내졌다. 네이티브 앱에서 받는 필수값 들을 체크하여 "" (빈값) 으로라도 보냈다. (앱에서 처리로직이 포함되어있어서 가능)
FCM request body for message using common notification object:
{
"message": {
"token": "dRXRYNSdTk2 ... spV903alOPs5uqNO1 ... b8jROy6PyjRvVy0utY8Bj-3cVu7hglEAkbl5PvJsalZcXi ... K0--oTg_6clJmLbBmudMlsAml86xFV17Az",
"data": {
"badge": "0",
"title": "댓글 등록되었습니다.",
"message": "댓글테스트 웹 5555",
"activityType": "DETAIL",
"menuCd": "M1000",
"openActivity": "{\"color\":\"\",\"input_yn\":\"Y\",\"sidebar_url\":\"https:///test/sideBar?testId\u003d10606\",\"title\":\"Task에 Comment가 등록되었습니다.\",\"url\":\"https://aw.aaa.com/approvalt/detail?id\u003d10606\",\"tid\":\"10606\"}",
"sender": "null (AA682)",
"sendDT": "-"
},
"apns": {
"payload": {
"aps": {
"alert": {
"title": "Task에 Comment가 등록되었습니다.",
"body": "댓글테스트 웹 5555"
},
"badge": 0,
"sound": "default",
"mutable-content": 1,
"content-available": 1
}
}
}
}
}
4) 데이터 포맷의 이슈는 없었지만, 공식 사이트에서 앱의 push service library 버전을 23이상 사용할 것을 추천하고 있습니다. 단, 낮은 버전이 사용 불가능한 건 아니라서 이것도 테스트를 해봐야 업데이트 여부가 확정될 듯 합니다.
(사용은 됬음)
2. iOS
1)
이번 변경 내용 중, 서버 <-> 앱 간 데이터 교환 포맷도 변경이 되었습니다.
제목/내용 외 별도 custom data 를 사용하는 경우(예:이미지, 링크URL 포함), 기존 방식(기존 변수명)으로 데이터 수신이 불가능한 경우가 있어 업데이트가 필요한 경우가 있었습니다. ==> 이번에 내가 작업한 앱 수정 했음
custom data 를 정의해서 사용 중인 앱이 있을경우
이 custom data 들이 서버에서 어떻게 전달되는지에 따라, 테스트 후 업데이트 여부가 결정될 듯 합니다
'개발 > 06.Android' 카테고리의 다른 글
[Android] 안드로이드 Cleartext HTTP traffic 에러 해결 (0) | 2023.12.19 |
---|---|
[Android] Android Studio에서 androidx 패키지 문제 해결 (2) | 2023.12.08 |
[Android Studio, intellij] 로그 한글 깨짐 현상 해결법 (2) | 2023.12.05 |
[Android] 파일 내 debug 라고 되어있는거 뭐야? 삭제해도되? (2) | 2023.11.23 |
[Android] 앱 아이콘 변경 (기존 앱 꺼 다른 이미지로 바꿔치기) (2) | 2023.11.21 |