마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Notification 실행 방법

0 추천

파이어베이스를 연동해서 sns앱을 만들고 있습니다.

상대방이 나의 게시물에 댓글을 달면 Notification으로 알림을 받고 싶습니다.

작동이 정상적으로 하는지 확인하려고 작성한 코드입니다.

앱을 백그라운드로 이동키시면 Log.e메시지가 성공이라고 나옵니다.

 @Override
    protected void onStop() {
        super.onStop();
        FcmPush.fcmPush.sendMessage("W02TxxCZp0UNpzhLtkPLdzI7hGw2","hi","hello");
    }

제가 하고싶은것은 log를 찍는것이 아니라 Notification으로 알림을 받고 싶습니다.

그런데 어떻게 해야 하는지 모르겠습니다...

그냥 메인에서는 버튼 누르면 Notification알림을 발생시키는 것은 가능한데 onResponse에서 Notification알림은 어떻게 하는지 모르겠습니다...

도와주세요.....

 

 

package com.psw.pswinstagram.navigation.util;

import android.util.Log;

import androidx.annotation.NonNull;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.gson.Gson;
import com.psw.pswinstagram.navigation.model.PushDTO;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class FcmPush  {
    private MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    private String url = "https://fcm.googleapis.com/fcm/send";
    private String serverKey = "AIzaSyBzf2ainfRVjomSeGAKAiMZplLrJKbrZNk";
    private Gson gson;
    private OkHttpClient okHttpClient;


//    private NotificationManager mNotificationManager;
//    public static NotificationManager manager;
//    public static NotificationCompat.Builder builder;
//    public static String CHANNEL_ID = "channel1";
//    public static String CHANEL_NAME = "Channel1";


    public static final FcmPush fcmPush = new FcmPush();

    public FcmPush(){
        gson = new Gson();
        okHttpClient = new OkHttpClient();
    }
    public void sendMessage(String destinationUid,String title,String message){
        FirebaseFirestore.getInstance()
                .collection("pushTokens")
                .document(destinationUid)
                .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if(task.isSuccessful()){
                    String token = task.getResult().get("pushToken").toString();
                    PushDTO pushDTO = new PushDTO();
                    pushDTO.setTo(token);
                    pushDTO.setTitle(title);
                    pushDTO.setBady(message);

                    RequestBody body = RequestBody.create(JSON,gson.toJson(pushDTO));
                    Request request = new Request.Builder()
                            .addHeader("Content-Type","application/json")
                            .addHeader("Authorization","key="+serverKey)
                            .url(url)
                            .post(body)
                            .build();
                    okHttpClient.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            Log.e("메세지TAG", "onResponse: 실패");

                        }
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            Log.e("메세지TAG", "onResponse: 성공");
                        }
                    });
                }
            }
        });
    }
}

 

개미1 (1,260 포인트) 님이 2022년 7월 5일 질문

1개의 답변

0 추천
님처럼 클라이언트의 특정이벤트를 받아서 특정 디바이스로 push notification을 보내려면 서버가 필요합니다. 파이어베이스로는 이 서버역할까지는 기본으로 제공하지 않습니다. 그리고 혹 모바일 앱을 서버로 사용하려고 한다면 적절한 해결방법이 아닙니다. 직접 푸시서비스를 관리하는 백엔드를 개발하시거나 Firebase function 같은 클라우드 서비스를 이용하여 서비스를 구축하거나  one signal 같은 무료사용을 지원하는 푸시 시스템을 이용해서 추가 개발을 하시거나, Braze같은 상용 솔루션을 사용해서 서버없이 어느정도 원하는 기능을 구현하실 수도 있습니다. 어쨋든 푸시를 관리하고 특정이벤트에 반응해서 처리하려면 어떤 형태로든 서버가 필요할 수 밖에 없습니다.
spark (227,470 포인트) 님이 2022년 7월 5일 답변
특정 토픽을 서버에 보내고 이걸 받고 싶은 클라이언트가 대기하도록 하는 걸 한번 시도해 보세요.
https://firebase.google.com/docs/cloud-messaging/android/topic-messaging

그리고 Firebase를 이용한 chat app 소스를 보시고 이걸 살짝 응용해 보세요.
https://firebase.google.com/codelabs/firebase-android#0

채팅 앱을 기반으로 해서 원하는 메세지가 오면 로컬 푸시를 표시할 수 있다면, 님이 원하는 기능과 거의 비슷해 질 것 같은데, 한번 시도해 보시죠.
...