티스토리 뷰
반응형
오늘은 파이어베이스 푸시 서비스를 적용하면서 발생하는 이슈들을 정리해보았습니다.
키값 설정
@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
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
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
그 외 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
반응형
'Server' 카테고리의 다른 글
[Java] JPA 복합키의 장점과 단점 알아보기 (0) | 2022.10.02 |
---|---|
[Java] 소수점 처리하기 (0) | 2022.09.26 |
Shell 파일에서 *.jar 파일 백그라운드 실행 (0) | 2022.09.21 |
[Java] QueryDSL 테스트 클래스에서 사용하기 (0) | 2022.09.12 |
Java Stream 을 활용한 Sum/Avg/Min/Max 구하기 (0) | 2022.09.11 |
[Java] QueryDSL 쿼리 로그 심플하게 출력하기 (0) | 2022.09.11 |
댓글
공지사항