민프

[PHP] Android, FCM, PHP을 이용해서 Push알림을 보내보자!! 본문

[PHP]

[PHP] Android, FCM, PHP을 이용해서 Push알림을 보내보자!!

민프야 2021. 7. 7. 16:44

이전 포스트에서는
https://minf.tistory.com/14

 

[Android] FCM Push 기능 구현해보자!!

FCM을 이용해서 알림 Push를 해보자! FCM이란 Firebase Cloud Messaging이고, 카카오톡에서 나에게 채팅이 오면 Push 알림이 오는 것 처럼 이 FCM을 이용하면 앱을 이용하는 이용자들에게 알림을 보내줄 수

minf.tistory.com

Firebase 홈페이지 Clould Message에서 직접 보내봤었는데
이번엔 서버에서 토큰 값을 이용하여 FCM 송신을 테스트 해보려고 한다.(PHP 이용)

 

토큰이란 무엇일까?

https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko 

 

앱 서버 전송 요청 작성  |  Firebase

Firebase Admin SDK 또는 FCM 앱 서버 프로토콜을 사용하여 메시지 요청을 작성하고 다음과 같은 타겟 유형으로 전송할 수 있습니다. 주제 이름 조건 기기 등록 토큰 기기 그룹 이름(기존 프로토콜 및 N

firebase.google.com

Firebase 공식문서에 따르면 특정 기기에 알림을 보내기 위해서
Access를 할 수 있는 Token값을 넣어줘야한다고 나와있다.

 

Firebase를 이용하기 위해 해당하는 앱의 디바이스 Token을 알아야하는데 
디바이스 토큰은 FCM을 이용하는데에 있어 식별할 수 있는 고유 키값으로 각 디바이스를 구분하는 데 사용된다.
이 디바이스 토큰은 변경될 수 있으므로
주기적으로 DB에 update하는 방식으로 코딩을 하여야 한다.

 

Token을 얻는 방식으로는

https://firebase.google.com/docs/cloud-messaging/android/first-message?hl=ko 

 

백그라운드 앱에 테스트 메시지 보내기  |  Firebase

FCM을 시작하기 위해 앱이 백그라운드 상태일 때 알림 작성기에서 개발 기기로 테스트 알림 메시지를 전송하는 가장 단순한 사용 사례부터 살펴보겠습니다. 이 페이지에는 설정부터 검증까지 이

firebase.google.com

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

이렇게 얻을 수 있다.

 

FCM을 하기위한 프로세스는

Volley http 통신(JAVA) -> send_FCM.php 접근(PHP, Curl 필요) ->

해당하는 서버에(https://fcm.googleapis.com/fcm/send) 값 전달(PHP)
이렇게 진행 될 것 이다.

 

MainActivity.java

    private void send_FCM(){
        Log.d(TAG+ " send_FCM", "실행");
        Response.Listener<String> responseListener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.d(TAG+ " send_FCM",response );


            }//  public void onResponse(String response)
        };
        fcm_request getUserInformation = new fcm_request(token,responseListener);
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        queue.add(getUserInformation);
    }
fcm_request.java


public class fcm_request extends StringRequest {
    // 서버 URL 설정 ( PHP 파일 연동 )
    final static private String URL = "http://.....sendCommentFCMRequest.php"; //내 서버 명
    private Map<String, String> map; // Key, Value로 저장 됨


    public fcm_request(String Token,Response.Listener<String> listener) {
        super(Method.POST, URL, listener, null);

        map = new HashMap<>();
        map.put("Token",Token);



    }
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return map;
    }
}
sendCommentFCMRequest.php

<?php
define('API_ACCESS_KEY','서버 AccessKey');
 $fcmUrl = 'https://fcm.googleapis.com/fcm/send';
 $token= $_POST["Token"]; //해당 Device TokenKey
    $notification = [
            'title' =>'title',
            'body' => 'body of message.',
            'icon' =>'myIcon', 
            'sound' => 'mySound'
        ];
        $extraNotificationData = ["message" => $notification,"moredata" =>'dd'];
        $fcmNotification = [
            //'registration_ids' => $tokenList, //multple token array
            'to'        => $token, //single token
            'notification' => $notification,
            'data' => $extraNotificationData
        ];
        $headers = [
            'Authorization: key=' . API_ACCESS_KEY,
            'Content-Type: application/json'
        ];


        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$fcmUrl);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fcmNotification));
        $result = curl_exec($ch);
        curl_close($ch);


        echo $result;
?>

이렇게 해주면

알림이 잘 나오는 것을 확인할 수 있다.

 

다음 포스트에서는 DB에 저장되어있는 유저가 올린 자신의 포스트에
댓글이 달렸을때 알림Push를 하는 기능을 구현해봐야겠다!!

Comments