Android
Firebase Cloud Messaging
Ricerca…
introduzione
Firebase Cloud Messaging (FCM) è una soluzione di messaggistica multipiattaforma che ti consente di consegnare i messaggi in modo affidabile senza alcun costo.
Utilizzando FCM, è possibile notificare a un'app client che sono disponibili nuove e-mail o altri dati da sincronizzare. È possibile inviare messaggi di notifica per guidare il riutilizzo e la fidelizzazione degli utenti. Per casi d'uso come la messaggistica istantanea, un messaggio può trasferire un carico utile fino a 4KB
in un'app client.
Configurare un'app client di messaggistica cloud Firebase su Android
Completa la parte Installazione e configurazione per collegare la tua app a Firebase.
Questo creerà il progetto in Firebase.Aggiungi la dipendenza per Firebase Cloud Messaging al tuo file
build.gradle
livello dibuild.gradle
:
dependencies {
compile 'com.google.firebase:firebase-messaging:10.2.1'
}
Ora sei pronto per lavorare con FCM in Android.
I client FCM richiedono dispositivi con Android 2.3
o versioni successive con installata l'app Google Play Store o un emulatore con Android 2.3 con API Google.
Modifica il tuo file 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>
Token di registrazione
All'avvio iniziale della tua app, l'SDK di FCM genera un token di registrazione per l'istanza dell'app client.
Se si desidera scegliere come target singoli dispositivi o creare gruppi di dispositivi, è necessario accedere a questo token estendendo FirebaseInstanceIdService
.
Il callback onTokenRefresh
ogni volta che viene generato un nuovo token ed è possibile utilizzare il metodo FirebaseInstanceID.getToken()
per recuperare il token corrente.
Esempio:
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);
}
}
Questo codice che ho implementato nella mia app per spingere immagini, messaggi e link per l'apertura nella tua webView
Questo è il mio 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;
}
}}
E questo è MainActivity per aprire il link nella mia WebView o altro depanditore del browser in base alle tue esigenze tramite intenti.
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();
}}
Ricevi messaggi
Per ricevere messaggi, utilizzare un servizio che estenda FirebaseMessagingService
e sovrascrivi il metodo 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());
}
//.....
}
Quando l'app è in background, Android indirizza i messaggi di notifica alla barra delle applicazioni. Un utente che tocca la notifica apre l'avvio dell'app per impostazione predefinita.
Ciò include i messaggi che contengono sia la notifica che il carico utile dei dati (e tutti i messaggi inviati dalla console delle notifiche). In questi casi, la notifica viene inviata alla barra delle applicazioni del dispositivo e il carico di dati viene consegnato negli extra dell'intento dell'attività di avvio.
Ecco un breve riassunto:
Stato dell'app | Notifica | Dati | Tutti e due |
---|---|---|---|
Primo piano | onMessageReceived | onMessageReceived | onMessageReceived |
sfondo | Area di notifica | onMessageReceived | Notifica: vassoio di sistema |
Dati: in extra dell'intento. |
Iscriviti a un argomento
Le app client possono iscriversi a qualsiasi argomento esistente oppure possono creare un nuovo argomento. Quando un'app client si iscrive a un nuovo nome di argomento, in FCM viene creato un nuovo argomento di tale nome e qualsiasi client può successivamente sottoscriverlo.
Per iscriverti a un argomento usa il metodo subscribeToTopic()
specificando il nome dell'argomento:
FirebaseMessaging.getInstance().subscribeToTopic("myTopic");