총 게시물 922건, 최근 0 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[안드로이드]

FCM 사용할 때

글쓴이 : 에찌 날짜 : 2017-03-06 (월) 09:42 조회 : 866
글주소 : http://www.androidside.com/B49_best/12698
 
  한국시뮬레이션기술
LS DYNA, SIMPACK, Simuform, FCM, VPG
www.kostech.co.kr
  RCHIPS 전자부품 쇼핑몰
FCM 실시간재고 및 가격 배송일표시 바로구매가능
www.rchips.com/
  감동드라마 원작 신조자룡!
드라마 무신조자룡 원작! 다양한 무장, 미인을 획득하여 삼국실화를 즐겨라!
jo.noblegames.kr/
신청하기


현재 안드로이드 스튜디오(IDE) 에서 FCM을 해보고있습니다.
지금 폰으로 연결을 못하고 있어서 에뮬레이터로 확인 중인데..
FCM 을 할 때 FirebaseMessagingService 를 상속받은 클래스에서 onMessageReceived를 오버라이드 하잖아여?

Firebase Cloud 에서 Noti를 보내면 onMessageReceived 로 RemoteMessage 데이터가 날아오는데 사람들을 보니
거의다 TITLE 하고 Message 를 remoteMessage.getData().get("message")로 받아오더라구염

그래서 저도 우선 그렇게 소스를 작성하여 에뮬레이터로 테스트를 해보았는데 getData에서는 데이터가 아예없고
remoteMessage.getNotification.getBody() 에는 제가 보낸 메시지가 들어있더라구염..

api를 아무리 찾아봐도 getData와 getBody에 대한 내용을 못찾아서.. 혹시 왜그런지 아니면 제가 멀 잘못작성했는지 알려주시면 감사하겠습니다 ㅠㅠ

관련 소스코드 첨부합니다.


public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
// Not getting messages here? See why this may be: https://goo.gl/39bRNJ
Logger.d("From: " + remoteMessage.getFrom());

// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Logger.d("Message data payload: " + remoteMessage.getData());
}

// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Logger.d("Message Notification Body: " + remoteMessage.getNotification().getBody());
}

// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
sendPushNotification(remoteMessage.getData().get("message"));
}

private void sendPushNotification(String message) {
Logger.d("received message : " + message);

//TEST 필요
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);

Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher) )
.setContentTitle(message)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri).setLights(000000255,500,2000)
.setContentIntent(pendingIntent);

// 화면이꺼진상태라면 화면을 킨다. 기존 PowerManager 의 WakeLock 같은 경우는 퍼미션도 필요하고, 현재 deprecated가 된 상태이다.
intent.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());

}
}


감사합니다.ㅠ



에찌 님의 개발 Q&A FAQ 최신글 [더보기]


질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

에찌 2017-03-06 (월) 10:04
https://firebase.google.com/docs/notifications/android/console-device?hl=ko
에 보니깐 관련 api 가 있기는 한데 제 문제를 해결해줄 수 있는 부분은 따로 없네요.;;;
댓글주소 추천 0 반대 0
에찌 2017-03-06 (월) 10:20
현재 remotemessage.getNotification()의 getTitle 과 getBody에는 각각 데이터와 타이틀이 들어오고있기는한데 getData() 는 여전히 데이터가 없네여...(size가 0..) 아무래도 getData().get("title") 또는 get("message") 로 데이터가 뽑아져야할 텐데 .. 무슨 이유로 데이터가 안들어올까여..
댓글주소 추천 0 반대 0
두라에몽 2017-03-06 (월) 10:25
https://firebase.google.com/docs/notifications/android/console-audience?hl=ko

onMessageReceived 재정의

FirebaseMessagingService.onMessageReceived 메소드를 재정의하면, 수신된 RemoteMessage 개체에 따라 작업을 수행하고 메시지 데이터를 가져올 수 있습니다.

 verbatim d208264044a529634eef60dda369a08b @Override
public void onMessageReceived(RemoteMessage remoteMessage) {
   
// ...

   
// TODO(developer): Handle FCM messages here.
   
// Not getting messages here? See why this may be: https://goo.gl/39bRNJ
   
Log.d(TAG, "From: " + remoteMessage.getFrom());

   
// Check if message contains a data payload.
   
if (remoteMessage.getData().size() > 0) {
       
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
   
}

   
// Check if message contains a notification payload.
   
if (remoteMessage.getNotification() != null) {
       
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
   
}

   
// Also if you intend on generating your own notifications as a result of a received FCM
   
// message, here is where that should be initiated. See sendNotification method below.
}
위 내용에 있네요
댓글주소 추천 0 반대 0
정에약한마음 2017-03-06 (월) 10:34
notification.title 메시지 제목 알림 제목을 나타냅니다.
notification.body 메시지 내용 알림 본문 텍스트를 나타냅니다.
댓글주소 추천 0 반대 0
정에약한마음 2017-03-06 (월) 10:35
https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/RemoteMessage.Notification?hl=ko
댓글주소 추천 0 반대 0
     
     
에찌 2017-03-06 (월) 10:41
[@정에약한마음]
네 이부분 api도 보긴했는데 그럼 getData() Map을 쓸 필요없이 notification 의 Title과 body로 Push내용을 보여주면 된다는 말씀이신가여? 현재 말씀하신 notification 의 title과 body로 데이터는 잘 오고는 있습니다만 getData() 부분의 데이터가 아예없어서 문제가 되지않을까 싶은 생각이 들었거든여..ㅎ
댓글주소 추천 0 반대 0
          
          
정에약한마음 2017-03-06 (월) 11:18
[@에찌]data는 설명하듯 노티피케이션과 다른 부류인것같네요 저기에서 찍듯이 size를 먼저 찍어보심이... 
 // Check if message contains a data payload.
   
if (remoteMessage.getData().size() > 0) {
       
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
   
}

   
// Check if message contains a notification payload.
   
if (remoteMessage.getNotification() != null) {
       
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
   
}
댓글주소 추천 0 반대 0
               
               
에찌 2017-03-06 (월) 12:59
[@정에약한마음]
넵..size를 체크해보니 0이 나와서..
그럼 굳이 getData()를 안쓰고 getNotification() 만 이용해서 타이틀하고 내용을 가져오면 되는 거겠죠..?
구글링을 하면서 보니깐 사람들이 getNotification() 으로 타이틀하고 내용을 가져오는게 아니라
getData().get("title") , getData().get("message") 를 사용한다고는 하는데 저는 도저히 getData()에서 값이 나오는 것을 볼 수가 없어서염..ㅠㅠㅠ 애뮬레이터라서 그런가...하는 생각도 들긴하네염..
댓글주소 추천 0 반대 0
          
          
두라에몽 2017-03-06 (월) 11:18
[@에찌]
그부분은 Null값을 전부 체크하셔야죠
댓글주소 추천 0 반대 0
               
               
에찌 2017-03-06 (월) 13:02
[@두라에몽]
Null Checking은 하고있습니다만..getData()의 용도가 타이틀하고 메시지를 가져오는게 맞는건지 모르겠어서... 분명 getData()를 사용하는게 맞을텐데 getNotification에는 값이 나오고 getData()에는 값이 안나오니 .. 왜 안나오는지 이유를 모르겠네여.. 단순히 위에 있는 로직이 끝인뎀...
댓글주소 추천 0 반대 0
lesky 2017-04-03 (월) 15:25
서버에서 보낼때 json의 데이터쪽에 데이터를 보낸다면 Data에 오고 Notification에 오면 Notification 에 값이 옵니다. 서버에서 보내는 Json Data를 보세요
http://ourcstory.tistory.com/6 Postman이라는 구글Chrome 앱을 사용하면 쉽게 테스트가 가능합니다.
댓글주소 추천 0 반대 0
이전글  다음글  목록 글쓰기

 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기