Android
Firebase 클라우드 메시징
수색…
소개
FCM (Firebase Cloud Messaging)은 비용없이 안정적으로 메시지를 전달할 수있는 교차 플랫폼 메시징 솔루션입니다.
FCM을 사용하면 새로운 이메일이나 다른 데이터를 동기화 할 수 있음을 클라이언트 응용 프로그램에 알릴 수 있습니다. 사용자에게 다시 보류 및 보류하도록 알림 메시지를 보낼 수 있습니다. 인스턴트 메시징과 같은 사용 사례의 경우 메시지는 최대 4KB
의 페이로드를 클라이언트 응용 프로그램으로 전송할 수 있습니다.
Android에 Firebase 클라우드 메시징 클라이언트 앱 설정
앱을 Firebase에 연결하려면 설치 및 설정 부분 을 완료하십시오.
그러면 Firebase에 프로젝트가 생성됩니다.Firebase Cloud Messaging에 대한 종속성을 모듈 수준
build.gradle
파일에build.gradle
합니다.
dependencies {
compile 'com.google.firebase:firebase-messaging:10.2.1'
}
이제 Android에서 FCM을 사용할 준비가되었습니다.
FCM 클라이언트에는 Google Play 스토어 앱이 설치된 Android 2.3
이상을 실행하는 기기 또는 Google API가 포함 된 Android 2.3을 실행하는 에뮬레이터가 필요합니다.
AndroidManifest.xml
파일 수정
<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
등록 토큰
앱을 처음 시작할 때 FCM SDK는 클라이언트 앱 인스턴스에 대한 등록 토큰을 생성합니다.
단일 장치를 대상으로하거나 장치 그룹을 만들려면 FirebaseInstanceIdService
를 확장하여이 토큰에 액세스해야합니다.
새로운 토큰이 생성 될 때마다 onTokenRefresh
콜백이 발생하고 FirebaseInstanceID.getToken()
메서드를 사용하여 현재 토큰을 검색 할 수 있습니다.
예:
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
}
이 코드는 이미지, 메시지 및 웹보기를 여는 데 필요한 링크를 푸시하기 위해 앱에서 구현 한 코드입니다.
이것은 내 FirebaseMessagingService입니다.
public class MyFirebaseMessagingService extends FirebaseMessagingService {
Bitmap bitmap;
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
String message = remoteMessage.getData().get("message");
//imageUri will contain URL of the image to be displayed with Notification
String imageUri = remoteMessage.getData().get("image");
String link=remoteMessage.getData().get("link");
//To get a Bitmap image from the URL received
bitmap = getBitmapfromUrl(imageUri);
sendNotification(message, bitmap,link);
}
/**
* Create and show a simple notification containing the received FCM message.
*/
private void sendNotification(String messageBody, Bitmap image, String link) {
Intent intent = new Intent(this, NewsListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("LINK",link);
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)
.setLargeIcon(image)/*Notification icon image*/
.setSmallIcon(R.drawable.hindi)
.setContentTitle(messageBody)
.setStyle(new NotificationCompat.BigPictureStyle()
.bigPicture(image))/*Notification with Image*/
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
public Bitmap getBitmapfromUrl(String imageUrl) {
try {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(input);
return bitmap;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}}
그리고 MainActivity는 내 WebView 또는 다른 브라우저에서 인 텐트를 통해 사용자 요구 사항에 대한 링크를 엽니 다.
if (getIntent().getExtras() != null) {
if (getIntent().getStringExtra("LINK")!=null) {
Intent i=new Intent(this,BrowserActivity.class);
i.putExtra("link",getIntent().getStringExtra("LINK"));
i.putExtra("PUSH","yes");
NewsListActivity.this.startActivity(i);
finish();
}}
메시지 수신
메시지를 수신하려면 FirebaseMessagingService
를 확장하고 onMessageReceived
메소드를 재정의하는 서비스를 사용하십시오.
public class MyFcmListenerService extends FirebaseMessagingService {
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
@Override
public void onMessageReceived(RemoteMessage message) {
String from = message.getFrom();
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
Map<String, String> data = message.getData();
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
//.....
}
앱이 백그라운드에있을 때 Android는 알림 메시지를 시스템 트레이로 보냅니다. 사용자가 알림을 탭하면 기본적으로 앱 실행기가 열립니다.
여기에는 알림 및 데이터 페이로드 (및 알림 콘솔에서 보낸 모든 메시지)가 포함 된 메시지가 포함됩니다. 이러한 경우 알림은 장치의 시스템 트레이로 전달되며 데이터 페이로드는 실행기 작업의 의도에 따라 추가로 제공됩니다.
다음은 간단한 요약입니다.
앱 상태 | 공고 | 데이터 | 양자 모두 |
---|---|---|---|
전경 | onMessageReceived | onMessageReceived | onMessageReceived |
배경 | 시스템 트레이 | onMessageReceived | 알림 : 시스템 트레이 |
데이터 : 의도 외의 범위. |
주제 구독
클라이언트 앱은 기존 주제를 구독하거나 새로운 주제를 만들 수 있습니다. 클라이언트 응용 프로그램이 새 주제 이름에 등록하면 해당 이름의 새 주제가 FCM에서 작성되고 모든 클라이언트가이 주제에 등록 할 수 있습니다.
토픽에 가입하려면 토픽 이름을 지정하는 subscribeToTopic()
메서드를 사용한다.
FirebaseMessaging.getInstance().subscribeToTopic("myTopic");