우리가 php server에서 fcm server로 알림 데이터를 보낼때는,
php server에서 server key를 첨부해서 데이터를 보내줘야 한다.
server key는 모두가 알듯이 파이어베이스 콘솔에서 발급받은 후 확인할 수 있다
다음 링크는 서버키 발급이 완료된 후, 확인할 수 있는 링크이다.
https://console.firebase.google.com/project/tiki-taka-22f76/settings/cloudmessaging
그런데, 이 링크에서 서버키를 확인할 수 없는 경우가 있다....
서버키를 파일로만 가지고 있고, 홈페이지에 따로 서버키가 안뜨는 경우이다.
해결방법
Cloud Messaging API(기존) 항목에서 맨 오른쪽에 점 3개 설정 버튼을 클릭한다.
그러면, 사진의 빨간 표시처럼 Google Cloud Console에서 API 관리라는 항목이 뜨고 클릭한다.
그리고, 이 친구를 설치해준다..
그러면 서버키가 잘 뜨는 것을 확인할 수 있다.
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
function sendFcmNotification($device_token, $messageData){
// URL 및 서버 키 설정
$url = 'https://fcm.googleapis.com/fcm/send';
$server_key = '여기다 문자열 서버키를 넣어주시면 됨';
// 데이터 및 헤더 준비
$fields = array(
'to' => $device_token, // 'registration_ids' 대신 'to'를 사용하고, 배열 대신 문자열 값을 사용
'data' => $messageData
);
$fields = json_encode($fields);
$headers = array(
'Content-Type:application/json',
'Authorization:key='.$server_key
);
// cURL 사용
// PHP의 cURL 라이브러리를 사용하여 FCM 서버에 POST 요청을 보냅니다
// 요청은 json_encode로 인코딩된 $fields를 바디로 포함합니다.
$ch =curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$result = curl_exec($ch);
$httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // HTTP 상태 코드 가져오기
if ($result === FALSE) {
// cURL 실행에 실패했을 경우
$errorMessage = 'Oops! FCM Send Error: ' . curl_error($ch);
error_log($errorMessage); // 에러 로그 기록
die($errorMessage);
return false;
}elseif($httpStatusCode == 200){
// 요청이 성공적으로 처리되었을 경우
return true;
}else {
// 그 외의 경우, 요청은 처리되었으나 성공적이지 않은 경우
$errorMessage = 'FCM Send Error: HTTP status code ' . $httpStatusCode;
error_log($errorMessage); // 에러 로그 기록
return false;
}
curl_close($ch);
}
?>
서버키를 문자열 안에 잘 넣어주면,
fcm 서버에 알림데이터를 잘 전송할 수 있다.
배경 이해
Firebase Cloud Messaging API(V1)과 Cloud Messaging API(기존)의 서비스 계정은 어떤 차이가 있을까??
내가 Firebase Cloud Messaging API(V1)에서 파일을 다운받아, 서버키를 사용했을때는 에러로그에 다음과 같이 떴다.
HTTP/2 프로토콜에서 발생하는 문제였다. 그런데, 기존에 홈페이지에 있는 문자열을 입력해주니 문제가 해결되었다.
아마 각자 다른 http 프로토콜을 사용하고 있기 때문에, Firebase Cloud Messaging API(V1)를 사용하려면, 시중에 있는 php 서버에서 fcm 서버로 알림 보내는 방법 등을 참고한 코드로만 작성하면 문제가 발생할 것이다. 그래서 http/2 프로토콜에 맞게 php 코드를 바꿔줘야 한다.
gpt 에게 물어보았더니 이런 답을 주었다.
HTTP/2는 이전 버전의 HTTP/1에 비해 성능이 향상되었으며, 다양한 새로운 기능을 제공합니다. HTTP/2는 다중화, 헤더 압축, 서버 푸시 등의 기능을 포함하고 있어서 네트워크 성능을 향상시키고 더 효율적으로 데이터를 전송할 수 있습니다.
Firebase Cloud Messaging API(V1)는 Firebase의 최신 기술을 반영하기 위해 HTTP/2를 사용합니다. 반면에 Cloud Messaging API(기존)는 이전 Google Cloud Messaging (GCM) 서비스로부터 Firebase로 이관되었을 때, GCM에서 사용하던 HTTP/1 기반의 프로토콜을 계속 사용하는 경우가 많았습니다.
따라서 Firebase Cloud Messaging API(V1)를 사용하는 경우 HTTP/2를 사용하여 더 효율적으로 데이터를 전송할 수 있습니다.
결론: 2가지 중 자신이 사용하는 API 맞게(사용하는 http 프로토콜이 다르므로) curl 코드를 바꿔줘야 한다는 것이다.
'Android' 카테고리의 다른 글
<Android> 동영상 s3 업로드 시, 진행률(%) 추적하는 방법, progress bar 알림 만들기 (1) | 2024.04.26 |
---|---|
(java) fcm 알림이 한번씩 누락될때 (2) | 2024.04.07 |
FirebaseMessaging.getInstance().getToken() 메서드가 호출안됨 (0) | 2024.03.30 |
안드로이드 스튜디오 layout editor 개념정리 (0) | 2023.09.12 |
안드로이드 매니패스트(manifest) 파일 (0) | 2023.09.09 |