티스토리 뷰

반응형

오늘은 파이어베이스 푸시 서비스를 적용하면서 발생하는 이슈들을 정리해보았습니다. 

키값 설정

@Getter
@Component
public class PushProperties {

    @Value("${push-key}")
    private String pushKey;
}

application.yml 파일 내에서 이루어진 값은 우리가 파이어베이스를 사용할 때 필요한 key를 저장한 곳이고, push-key: ABCDE 의 형태로 저장이 됩니다.

 

푸시를 위한 데이터 DTO 설정하기

@Autowired
private PushProperties properties;
@BeforeEach
void createTokens() {
    pushList = new ArrayList<>();
    for(String cols : pushes) {
        final String[] col = cols.split(",");
        Push push = new Push();
        push.setTitle(col[0]);
        push.setBody(col[1]);
        push.setDescription(col[2]);
        push.setTargets(PushTargets.valueOf(col[3]));
        push.setAppPlatform(AppPlatform.valueOf(col[4]));
        try {
            push.setVersion(col[6] == null ? null : col[5]);
        } catch (ArrayIndexOutOfBoundsException ignored) {}
        pushList.add(push);
    }

    pushTokens = new ArrayList<>();
    for(String cols : tokens) {
        final String[] col = cols.split(",");
        PushToken pushToken = PushToken.builder()
            .deviceId(col[0])
            .platform(AppPlatform.valueOf(col[1]))
            .token(col[2])
            .build();
        pushTokens.add(pushToken);
    }
}

위에서 설정한 키값을 가져와 앱 푸시를 발송할 준비를 합니다. 

 

단건 발송

Firebase Message Format 에 대한 상태

https://firebase.google.com/docs/cloud-messaging/migrate-v1?hl=ko 

 

기존 HTTP에서 HTTP v1로 마이그레이션  |  Firebase 클라우드 메시징

2022년 10월 18일에 오프라인과 온라인으로 진행될 Firebase Summit에 참여하세요. Firebase로 앱을 빠르게 개발하고 안심하고 앱을 출시하며 손쉽게 확장하는 방법을 알아보세요. 지금 등록하기 의견 보

firebase.google.com

 

static final String FIREBASE_URL = "https://fcm.googleapis.com/fcm/send";

public void sendSimplePushTo(List<PushToken> tokens) {
        HttpClient httpClient = HttpClientBuilder.create().build();
        try {
            String key = properties.getPushKey();
            HttpPost request = new HttpPost(FIREBASE_URL);
            StringEntity params = new StringEntity(toFirebaseFormat(pushList.get(0), pushTokens.get(2)).toString(), "UTF-8");
            params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json; charset=UTF-8"));
            request.setEntity(params);
            request.addHeader("Authorization", "key=" + key);
            HttpResponse response = httpClient.execute(request);
            System.out.println("response = " + response);
            final InputStream content = response.getEntity().getContent();
            System.out.println("content = " + content);
            final byte[] bytes = content.readAllBytes();
            String result = new String(bytes);
            System.out.println("result = " + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

{ error: 'InvalidRegistration' } 관련 에러
토픽을 정해주지 않았기 때문에 발생하는 에러였습니다.

 

https://stackoverflow.com/questions/44035518/firebase-fcm-error-invalidregistration

 

Firebase FCM error: 'InvalidRegistration'

I am currently trying to send a PushNotification to a Device Group using FCM with the help of Firebase Cloud Functions but once the notification is sent, it returns with code 200 but with failure :

stackoverflow.com

private String[] topics = {
    "/topics/development",
    "/topics/production"
};

 

다중 발송

public JSONObject toFirebaseFormat(Push push, List<PushToken> pushTokens) {
    List<String> tokens = pushTokens.stream().map(PushToken::getToken).collect(Collectors.toList());
    String title = push.getTitle();
    String body = push.getBody();
    final Map<String, Object> data = Map.of("pushId", push.getPushId().longValue(),
        "timestamp", System.currentTimeMillis());
    Map<String, Object> notification = Map.of("title", title,
        "body", body);

    long now = System.currentTimeMillis();
    Map<String, Object> request = Map.of(
        "data", data,
        "messageId", now,
        "mutableContent", true,
        "notification", notification,
        "registration_ids", tokens,
        "sendTime", now
    );
    JSONObject json = new JSONObject(request);
    return json;
}

 

{ "error":"NotRegistered" } 관련 에러

등록되지 않은 기기로 테스트할 때 발생하는 에러입니다.

https://stackoverflow.com/questions/42241432/fcm-push-notification-issue-errornotregistered

 

FCM push notification issue: "error":"NotRegistered"

I am getting weird issue of sending push notification to Android using FCM. Goal :- Having error while sending push notification Below is the scenario I do have function for sending push notifica...

stackoverflow.com

 

그 외 import 내용


import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.json.JSONObject;

 

그 외 응답코드 정의 

https://firebase.google.com/docs/cloud-messaging/http-server-ref#table9

 

Firebase 클라우드 메시징 HTTP 프로토콜

FirebaseVisionOnDeviceAutoMLImageLabelerOptions

firebase.google.com

 

반응형
댓글
공지사항