Comment configurer plusieurs récepteurs de diffusion pour gérer les notifications push sur Android
Publié: 2024-11-23Les récepteurs de diffusion sont les gestionnaires permettant de recevoir et de traiter les notifications push envoyées à un appareil Android. La configuration d'un seul récepteur de diffusion pour gérer les notifications push vers votre application est un processus simple.
Mais que se passe-t-il si vous devez gérer des notifications push provenant de sources disparates ? depuis plusieurs fournisseurs de notifications push tiers et/ou depuis vos propres serveurs, par exemple ?
Il y a deux façons de procéder.
A. Initialisation de plusieurs récepteurs de diffusion dans votre AndroidManifest.xml
Lorsque vous initialisez deux récepteurs de diffusion ou plus dans le fichier AndroidManifest.xml de votre application, chacune des méthodes onReceive de ces récepteurs est appelée lorsque votre application reçoit une notification push. Ci-dessous, j'ai un code XML expliquant comment avoir un récepteur de diffusion pour CleverTap et un récepteur de diffusion pour ma propre application LocalBot.
<receiver android:name="com.example.LocalBot.MyBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver> <receiver android:name="com.clevertap.android.sdk.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver>
<receiver android:name="com.example.LocalBot.MyBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver> <receiver android:name="com.clevertap.android.sdk.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver>
Notez que, même si les deux récepteurs seront appelés sur un message entrant, une double gestion est très improbable car les fournisseurs tiers ignoreront les charges utiles qui ne contiennent pas leurs identifiants uniques. Si vous envoyez vos propres charges utiles, assurez-vous d'inclure votre propre identifiant unique.
Il s'agit de la solution la plus simple, mais elle est quelque peu inefficace car les deux récepteurs seront invoqués pour chaque notification entrante.
Examinons maintenant la deuxième stratégie, plus efficace.
B. Un récepteur de diffusion commun pour le routage des transmissions vers les récepteurs de diffusion concernés.
Dans cette approche progressivement plus efficace, vous enregistrez uniquement votre propre récepteur de diffusion personnalisé. Vous acheminez ensuite la notification push entrante via votre propre récepteur de diffusion, soit vers un récepteur de diffusion spécifique, soit vers tous les autres récepteurs de diffusion. Vous pouvez utiliser votre propre discrétion pour décider du cas d’utilisation de l’une ou l’autre des approches susmentionnées.
Dans le cas de Clevertap, nous savons que la charge utile JSON de ceux-ci contient la clé « nm ». Cela peut être utilisé pour identifier une notification push Clevertap et transmettre la notification au gestionnaire de diffusion respectif de Clevertap. De même, dans le cas de Parse, Appboy ou Localytics, vous pouvez consulter la documentation de leur API pour déterminer quel serait un moyen d'identifier de manière unique leur charge utile push JSON.
Ci-dessous, je vais parcourir un petit morceau de code dans lequel j'ai mon propre gestionnaire de diffusion, MyBroadcastReceiver.java. Il s'agit du gestionnaire de diffusion par lequel transitent toutes les notifications push. J'ai une vérification de condition pour voir si une poussée provient de Clevertap, et si c'est le cas, je la transmets au gestionnaire de diffusion de Clevertap. Sinon, je le transmets à mon propre gestionnaire de charge utile push JSON. Supposons pour le bien de cette discussion que j'attends uniquement des notifications push de Clevertap et de mes propres serveurs.
J'ai d'abord inclus mon gestionnaire de diffusion dans mon fichier AndroidManifest.xml comme suit : -
<receiver android:name="com.example.LocalBot.MyBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver>
<receiver android:name="com.example.LocalBot.MyBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver>
Ensuite, j'ai créé la classe MyBroadcastReceiver comme suit : -
package com.example.LocalBot; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.content.WakefulBroadcastReceiver; import android.util.Log; import com.clevertap.android.sdk.CleverTapAPI; import com.clevertap.android.sdk.GcmBroadcastReceiver; import com.google.android.gms.gcm.GoogleCloudMessaging; public class MyBroadcastReceiver extends WakefulBroadcastReceiver { public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); String messageType = gcm.getMessageType(intent); if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { String ctpn = extras.getString(CleverTapAPI.NOTIFICATION_TAG); if(ctpn!=null && ctpn.equals("true")) { GcmBroadcastReceiver obj = new GcmBroadcastReceiver(); obj.onReceive(context, intent); } } else { MyHandler obj = new MyHandler(); obj.handlePush(intent); } } }
package com.example.LocalBot; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.content.WakefulBroadcastReceiver; import android.util.Log; import com.clevertap.android.sdk.CleverTapAPI; import com.clevertap.android.sdk.GcmBroadcastReceiver; import com.google.android.gms.gcm.GoogleCloudMessaging; public class MyBroadcastReceiver extends WakefulBroadcastReceiver { public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); String messageType = gcm.getMessageType(intent); if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { String ctpn = extras.getString(CleverTapAPI.NOTIFICATION_TAG); if(ctpn!=null && ctpn.equals("true")) { GcmBroadcastReceiver obj = new GcmBroadcastReceiver(); obj.onReceive(context, intent); } } else { MyHandler obj = new MyHandler(); obj.handlePush(intent); } } }
Désormais, toutes les notifications push passeront par mon récepteur de diffusion, MyBroadcastReceiver.java et seront acheminées vers le gestionnaire de diffusion respectif en conséquence.
Si vous souhaitez transmettre une notification à tous vos récepteurs de diffusion, vous pouvez supprimer les vérifications if else et appeler tous vos récepteurs de diffusion, comme indiqué ci-dessous : -
public class MyBroadcastReceiver extends WakefulBroadcastReceiver { public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); String messageType = gcm.getMessageType(intent); if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { new com.clevertap.android.sdk.GcmBroadcastReceiver().onReceive(context, intent); new MyNotificaitonHandler().handleReq(intent); } }
J'espère que vous avez apprécié la lecture de cet article de blog et que vous avez développé une assez bonne compréhension de la façon de configurer plusieurs récepteurs de diffusion pour votre application Android.