Ce que je veux: Je veux envoyer une notification Push aux utilisateurs. Lorsque l'utilisateur appuie sur cette notification, il doit accéder à une activité spécifique.
Ce que j'ai fait: J'ai créé un lien profond dans la console Firebase. J'ai également implémenté FirebaseInstanceIdService & FirebaseMessagingService . Je peux attraper le message Firebase que j'ai envoyé à partir de la console Firebase.
Quel est le problème: Je ne parviens pas à saisir le lien dynamique créé par la console Firebase.
Mon code est comme ci-dessous.
MyFirebaseInstanceIDService.Java
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private final String TAG = "MyFirebaseInstanceID";
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.e(TAG, "Refreshed token: " + refreshedToken);
}
}
MyFirebaseMessagingService.Java
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private final String TAG = "MyFbaseMessagingService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
String message = remoteMessage.getNotification().getBody();
Log.e(TAG, "\nmessage: " + message);
sendNotification(message);
}
private void sendNotification(String message) {
Intent intent = new Intent(this, TestDeepLinkActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setAutoCancel(true)
.setContentTitle("FCM Test")
.setContentText(message)
.setSound(defaultSoundUri)
.setSmallIcon(R.drawable.common_google_signin_btn_icon_dark)
.setContentIntent(pendingIntent);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(0, builder.build());
}
}
Image de la console Firebase
Solution:
https://developer.Android.com/training/app-links/deep-linking
J'utilisais ces deux liens comme lien profond: "www.somedomain.com/about" & "www.somedomain.com/app".
S'il vous plaît ne pas ajouter http ou https dans le filtre d'intention, ils ne sont pas supportés. Chekout this conversation pour plus de précisions. Je mets aussi une image de ce chat, si le lien expire à l'avenir.
MyFirebaseMessagingService.Java
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
String title = data.get("title");
String message = data.get("message");
String deepLink = data.get("deepLink");
Notification notification = new Notification();
notification.setTitle(title);
notification.setMessage(message);
notification.setDeepLink(deepLink);
sendNotification(this, title, message, deepLink);
}
public static void sendNotification(Context context, String title, String message, String deepLink) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= 26) {
NotificationChannel notificationChannel = new NotificationChannel("any_default_id", "any_channel_name",
NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setDescription("Any description can be given!");
notificationManager.createNotificationChannel(notificationChannel);
}
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setSmallIcon(R.mipmap.ic_launcher)
.setPriority(Android.app.Notification.PRIORITY_MAX)
.setDefaults(Android.app.Notification.DEFAULT_ALL)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(deepLink));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
notificationBuilder
.setContentTitle(title)
.setContentText(message)
.setContentIntent(pendingIntent);
notificationManager.notify(0, notificationBuilder.build());
}
}
AndroidManifest.xml
<activity
Android:name=".mvp.view.activity.ActivityName"
Android:label="@string/title_activity_name"
Android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data
Android:Host="www.somedomain.com"
Android:path="/about"
Android:scheme="app" />
</intent-filter>
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data
Android:Host="www.somedomain.com"
Android:path="/contact"
Android:scheme="app" />
</intent-filter>
</activity>
Extra:
Si vous souhaitez recevoir davantage de données (i.e userId ou loanId) dans cette activité, vous pouvez les transmettre à tout en envoyant une notification Push de votre serveur (i.e back-end ou un tableau de bord basé sur le Web). Vous pouvez faire comme ci-dessous.
{
"data": {
"userId": "65431214564651251456",
"deepLink": "www.somedomain.com/app",
"title": "This is title!",
"message": "This is message!"
},
"to": "FCM token here"
}
Important: ci-dessous, JSON ne fonctionnera pas, ceci est pour référence seulement. Ceci est également mentionné nulle part dans la documentation. Alors, prenez-en soin. JSON correct est ci-dessus.
{
"to": "FCM Token here",
"notification": {
"Body": "This week’s edition is now available.",
"title": "NewsMagazine.com",
"icon": "new"
},
"data": {
"title": "This is title!",
"message": "This is message!"
}
}
Vous pouvez recevoir des données supplémentaires (i.e userId ou loanId) dans la méthode onMessageReceived of MyFirebaseMessagingService class comme ci-dessous.
String userId = data.get("userId");
intent.putExtra(Intent.EXTRA_TEXT, userId);
Et dans cette activité, vous pouvez écrire comme ci-dessous dans la méthode onCreate.
Intent intent = getIntent();
if (intent != null) {
String intentStringExtra = intent.getStringExtra(Intent.EXTRA_TEXT);
if (intentStringExtra != null) {
userId = intentStringExtra;
}
}