web-dev-qa-db-fra.com

Lien profond avec notification push - FCM - Android

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

 Firebase Console Image

2
Maulik Dodia

Solution:

  • Je dois ajouter un filtre d'intention dans une activité du fichier de manifeste vers laquelle je veux aller, lors de la saisie de la notification Push. Cette notification comportera des URL appelées lien profond dans la terminologie Android. Vous pouvez vous référer au lien ci-dessous pour plus d'informations sur deeplink.

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.

 enter image description here

  • Veuillez vous reporter au code ci-dessous pour savoir comment je passe les liens profonds à NotificationManager. intent-filter intercepte automatiquement et lance cette activité particulière.

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;
       }
    }
    
1
Maulik Dodia