http://trandent.com/board/Android/detail/739



Firebase Cloud Messaging을 사용하여 안드로이드 푸시 알림을 구현 하는 방법 입니다.

 

 

1. project level의  build.gradle 파일에 google-service를 추가합니다.

 

dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
//classpath 'com.google.gms:google-services:3.0.0'
classpath 'com.google.gms:google-services:3.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}

2. app level의 build.gradle 파일에 firebase-messaging을 추가합니다. 그리고 google-service plugin을 apply 해줍니다.

 

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'

compile 'com.google.firebase:firebase-messaging:9.0.2'

}
apply plugin: 'com.google.gms.google-services'

 

 

3. Android-manifest.xml

 

<application></application> 태그 안에 아래 내용을 추가해 줍니다.
<service
android:name=".FirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service
android:name=".FirebaseInstanceIDService" >
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>

4. FirebaseInstanceIDService.java

/**
* Created by HKH on 2016-06-28.
*/
import android.util.Log;

import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;


public class FirebaseInstanceIDService extends FirebaseInstanceIdService {

private static final String TAG = "MyFirebaseIIDService";

// [START refresh_token]
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String token = FirebaseInstanceId.getInstance().getToken();

}

}

사용자 기기별 token을 생성하는 클래스 입니다.

나중에 push 알림을 특정 타겟에게 보낼 때 사용되는 고유 키 값 입니다.

이 토큰값을 용도에 맞게 사용하시면 됩니다.


5. FirebaseMessagingService.java


/**
* Created by HKH on 2016-06-28.
*/
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.PowerManager;
import android.support.v4.app.NotificationCompat;

import com.google.firebase.messaging.RemoteMessage;

import java.io.BufferedInputStream;
import java.net.URL;
import java.net.URLConnection;


public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {
private static final String TAG = "FirebaseMsgService";

// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

sendPushNotification(remoteMessage.getData().get("message"));
}

private void sendPushNotification(String message) {
System.out.println("received message : " + message);
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);

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

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
wakelock.acquire(5000);

notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}

}


푸시메세지가 들어왔을때 실제 사용자에게 푸시알림을 만들어서 띄워주는 클래스 입니다.

Api를 통해 푸시 알림을 전송하면 입력한 내용이 message에 담겨서 오게 됩니다.


6. MainActivity.java


import com.google.firebase.messaging.FirebaseMessaging;

onCreate 함수 안에

FirebaseMessaging.getInstance().subscribeToTopic("notice");

-> 여기서 topic은 api를 사용하여 푸시 알림 전송시 같은 토픽명 그룹 전체에 메세지를 발송 할 수 있습니다.

 

 테스트는 Firebase Console의 Notification 메뉴에서 가능합니다.

 

 

 

 

백그라운드 푸시알림 받기 :: https://trandent.com/board/Android/detail/744 

 

+ 내용 추가 

 

1. android sdk에 google play services 가 설치되어있지 않아서 오류가 발생한다면

 

android studio 사용중이시라면 tools -> android -> SDK manager -> SDK Tools 탭에 들어가셔서 Google Play services 설치해 보시기 바랍니다.

2. onTokenRefresh에서 뿐만 아니라 어느 시점에서든 

String token = FirebaseInstanceId.getInstance().getToken(); 을 사용하게 되면 사용자 기기의 고유 토큰 값을 가져 올 수 있습니다.

여기서 얻은 토큰으로 특정 사용자에게 푸시알림 전송이 가능합니다.

첨부파일
  Sign in required
  •  : 김효중
    2017-08-01 11:54


    FirebaseMessagingService에서 계속 오류가 발생했엇는데,
    
    Gradle 의 app 레벨에
    compile 'com.google.firebase:firebase-core:10.0.1'
    
    이 있어야 FirebaseMessagingService에서 에러가 안나네요
  •  : Jaeseo Park
    2017-03-06 17:32


    ㅎㅎ 저두 얼른 FCM을 자유자재로 하고싶은데 너무 안일하게 생각했나봐여 잘안풀리네여 ㅎㅎ 그래도 도움 많이 감사드려요 덕분에 조금씩 진도가 나가고있네여 ㅎㅎ
  •  : Kyuho Han
    2017-03-06 17:09


    네ㅎㅎ 저같은 경우는 서버에서 보낼때 title은 사용 안하고 data 안에 제가 필요한 파라미터를 정의해서 json형식으로 사용합니다
  •  : Jaeseo Park
    2017-03-06 13:54


    아아아아아아!!! 해결했어요!!
    
    저혼자 이상한 말 다하고 .. ㅈㅅ합니다..
    
    말씀하신 고급옵션에 보니깐 맞춤 데이터라고 따로 있네요 여기서 key 하고 value를 설정하니깐 되네여..
    
    ㅠㅠ 알려주신 점들 정말 감사합니다.
  •  : Jaeseo Park
    2017-03-06 13:45


    쉽게 정리해서 말씀드리면 firebase console로 메시지를 보내면 Client에서는 getNotification().getTitle() 그리고 getNotification().getBody()로 메시지의 타이틀과 내용을 받을 수 있고
    webserver에서 
    Content-Type : application/json
    Authorization : key="구글서 발급 받은 키"
    body : 
    {
        "to": "위에 프로젝트에서 받은 token",
        "data": {
          "title" : "푸시 타이틀",
          "message": "푸시 내용",
         }
      }
    
    이런 형태로 메시지를 보내게되면 Client에서는 getData().get("title") 그리고 getData().get("message") 로 메시지의 타이틀과 내용을 받아올수있다.. 가 맞는가여?