웹 | fcm topic 전송 방식
페이지 정보
작성자 최고관리자 조회17,054회 댓글0건본문
FCM Topic 관련 내용 입니다.
푸시 업데이트 이후에 전송은 전체적으로 3가지를 이용하게 될거 라고 예상 될것 같습니다.
1. 폰 token을 이용해서 전송하는 방식 (FCM 기존방식)
: 특정 토큰을 가진 회원에게만 전송하는 방식
바로 푸시를 받아야할 경우 topic으로는 전송시간이 1분까지도 걸릴 수 있으므로 회원에게
토큰으로 전송하는 방법도 적극 활용해야합니다. (채팅 알림 등..)
(해당 토큰방식은 올라온 내용이 많아서 기술에 대해서 제외 하겠습니다.)
2.[Topic]구독하고 있는 전체 회원에게 전송하는방식 (topic)
: 모든 채널에게 전송하는 방식
(전체 회원에게 전송하는 방식입니다.) - 특정회원은 못 받게 할 수는 없습니다.
3.[Topic]특정 채널에게만 보내는 방식 (condition)
: condition에 조건을 걸어서 특정 채널에게만 전송 할수 있습니다.
(조건이 걸려서 그런지 전송 시간 소요가 있습니다 ,1분이내) - 다소 소요시간이 있습니다.
3번의 경우 예를 들어,
-채팅알림
-공지알림
- 마케팅 푸시 알림
위와 같이 3개의 알림 체크 설정이 있다면,
총 3개의 topic 채널이 필요하게 됩니다.
2. [Topic]구독하고 있는 전체 회원에게 전송하는방식 (topic)
- php (전송단)
function send_notification($title, $msg,$idx,$topic)
{
global $DB;
$url = 'https://fcm.googleapis.com/v1/projects/프로젝트-id/messages:send';
putenv('GOOGLE_APPLICATION_CREDENTIALS='.$_SERVER['DOCUMENT_ROOT'].'/lib/발급 받은 프로젝트_key.json');
$scope = 'https://www.googleapis.com/auth/firebase.messaging';
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->setScopes($scope);
$auth_key = $client->fetchAccessTokenWithAssertion();
$ch = curl_init();
$notification_opt = array (
'title' => $title,
'body' => $msg,
);
$datas = array (
'title' => $title,
'body' => $msg,
'idx' => (string)$idx,
);
$android_opt = array (
'notification' => array(
'default_sound' => true,
"channel_id" => 'default',
),
'priority' => 'high',
'data' => $datas,
);
$message = array
(
'notification' => $notification_opt,
'data' => $datas,
'android' => $android_opt,
'topic' => $topic
);
// 해당 부분에 전체 메세지 전송할 topic의 명을 배열에 추가 해줍니다.
$last_msg = array (
"message" => $message
);
$headers = array
(
'Authorization: Bearer ' . $auth_key['access_token'],
'Content-Type: application/json'
);
$last_msg = array (
"message" => $message
);
$headers = array
(
'Authorization: Bearer ' . $auth_key['access_token'],
'Content-Type: application/json'
);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($last_msg));
$result = curl_exec($ch);
if($result === FALSE){
}
}
3. [Topic] 특정 topic 채널에게만 전송 하는 방식 (condition)
해당 전송방식은 특정 채널 topic에게만 전송하는 방식이므로,
조건을 겁니다.
fcm message 에 topic 이나 token대신에 condition 이 추가됩니다.
'토픽채널명1' in topics || '토픽채널명2' in topics
다음과 같이 구성됩니다
php 예시
function send_notification($title, $msg,$idx,$condition)
{
global $DB;
//토픽 채널은 다음과 같이 조건을 추가할 수 있음
$url = 'https://fcm.googleapis.com/v1/projects/프로젝트-id/messages:send';
putenv('GOOGLE_APPLICATION_CREDENTIALS='.$_SERVER['DOCUMENT_ROOT'].'/lib/구글에서발급받은fcm키.json');
$scope = 'https://www.googleapis.com/auth/firebase.messaging';
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->setScopes($scope);
$auth_key = $client->fetchAccessTokenWithAssertion();
$ch = curl_init();
$notification_opt = array (
'title' => $title,
'body' => $msg,
);
$datas = array (
'title' => $title,
'body' => $msg,
'idx' => (string)$idx,
);
$android_opt = array (
'notification' => array(
'default_sound' => true,
"channel_id" => 'default',
),
'priority' => 'high',
'data' => $datas,
);
$message = array
(
'notification' => $notification_opt,
'data' => $datas,
'android' => $android_opt,
'condition' => $condition // 해당 부분에 다음과 같이 조건으로 들어갑니다. ('토픽채널명1' in topics || '토픽채널명2' in topics) 구분자 - (||)
);
$last_msg = array (
"message" => $message
);
$headers = array
(
'Authorization: Bearer ' . $auth_key['access_token'],
'Content-Type: application/json'
);
$last_msg = array (
"message" => $message
);
$headers = array
(
'Authorization: Bearer ' . $auth_key['access_token'],
'Content-Type: application/json'
);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 요청 타임아웃 설정
// curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 연결 타임아웃 설정
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($last_msg));
$result = curl_exec($ch);
if($result === FALSE){
}
}
4. react-native 소스단 클라이언트 에는 topic 채널 구독여부에 따라서 해당 채널로 전송된 푸시를 받거나 안받을 수 있습니다.
푸시의 기본설정과 동일하며 추가된 함수는 해당부분 밖에 없습니다.
topic 채널을 두개 쓰는경우의 예시 (topic_channel1,topic_channel2)
해당방법과 동일하게 앱 실행시에 유저의 알림 수신여부 값을 서버로 부터 가져와서 구독하거나 구독하지 않도록 설정 해줍니다.
당연한 부분이지만, 앱에서 알림 설정 페이지가 있다면 알림을 ON,OFF할때마다 구독여부를 변경 해주어야합니다.
해당과 같은 체크박스가 변경후 저장했을시 동일 구독함수를 넘겨와서 처리하였습니다.
토큰을 이용하는 방식이나,
topic방식이나
topic의 condition 경우
전송을 어떻게 할지에 따라서 해당 방법중 에 채택을 하여 구성 해야해야 할듯 합니다.