Je travaille sur les notifications Push dans Xamarin.Forms
en utilisant Plugin.FirebasePushNotification
. Les notifications n'ouvrent pas de vue spécifique lorsque l'application est fermée (supprimée de la barre des tâches).
Lorsque l'application est ouverte ou en arrière-plan, je peux accéder à une page spécifique en cliquant sur notification . C'est la classe d'application.
public class AppClass : Android.App.Application, Android.App.Application.IActivityLifecycleCallbacks
{
public override void OnCreate()
{
base.OnCreate();
RegisterActivityLifecycleCallbacks(this);
FirebasePushNotificationManager.Initialize(this,false,true);
var instanceid = FirebaseInstanceId.Instance.Token;
}
}
Classe MainActivity
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
protected override void OnNewIntent(Intent intent)
{
base.OnNewIntent(intent);
FirebasePushNotificationManager.ProcessIntent(this, intent);
}
Classe App.xaml.cs dans un projet partagé
protected override void OnStart()
{
CrossFirebasePushNotification.Current.OnNotificationOpened += (s, p) =>
{
if (p.Data.ContainsKey("color"))
{
Device.BeginInvokeOnMainThread(() =>
{
Xamarin.Forms.Application.Current.MainPage.Navigation.PushModalAsync(new Page1()
{
BackgroundColor = Color.FromHex($"{p.Data["color"]}")
});
});
}
};
}
C'est la charge que j'envoie de Postman
{
"to":"dhNe4U_jSDo:APA91bHhupDfnqW5Y9EBIfWV-uQVmq_HyPXTzBZ_TnSfM-7cDEq8SUFDLeudA4vWzyMj28E8A_c5HS0F2f5xT8quWZHcmWL8RJEbeDNre3RMsuY7brcAxqQMQOMCDcVXWDsl7s15l-NC",
"notification" : {
"body" : "New announcement assigned",
"content_available" : true,
"priority" : "max",
"color":"Page1",
"content_available" : true,
"title": "notification TITLE",
"content_available" : true,
"body": "notification BODY",
},
"data" : {
"OrganizationId":"2",
"color":"Page1",
"click_action":"MainActivity"
"sectionId":"33",
"priority" : "high",
"title": "notification TITLE",
"content_available" : true,
"body": "notification BODY",
}
}
Ceci est mon cours
<application Android:label="FCMPush.Android">
<uses-permission Android:name="Android.permission.INTERNET" />
<receiver
Android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
Android:exported="false" />
<receiver
Android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
Android:exported="true"
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="${applicationId}" />
</intent-filter>
</receiver>
</application>
J'ai assigné ce problème sur GitHub également. Je vous remercie.
Eh bien, je ne suis pas vraiment sûr où le problème pourrait être. Cependant, si nous regardons la documentation: https://github.com/CrossGeeks/FirebasePushNotificationPlugin/blob/master/docs/GettingStarted.md , vous pouvez essayer plusieurs choses.
Tout d’abord, définissez Exported = true
et LaunchMode = LaunchMode.SingleTop
dans votre MainActivity
. Egalement définissez FirebasePushNotificationManager.ProcessIntent(this, Intent);
dans votre onCreate()
, juste après LoadApplication(new App());
.
Notez que depuis Android 8.0, vous devez également définir DefaultNotificationChannelId
et DefaultNotificationChannelName
dans la fonction onCreate()
de votre application.
Ensuite, si vous avez une SplashActivity
, assurez-vous d’y ajouter MainLauncher = true, NoHistory = true
et le code suivant dans onCreate()
:
var mainIntent = new Intent(Application.Context, typeof(MainActivity));
if (Intent.Extras != null) {
mainIntent.PutExtras(Intent.Extras);
}
mainIntent.SetFlags(ActivityFlags.SingleTop);
StartActivity(mainIntent);
Je vous recommanderais également de jeter un coup d'œil au dossier suivant du référentiel: https://github.com/CrossGeeks/FirebasePushNotificationPlugin/tree/master/samples/FirebasePushSample/FirebasePushSample.Android . Si vous suivez attentivement tout le code, cela devrait fonctionner.
si votre activité splash a eu lieu avant l'activité principale, envoyez les informations Push à l'activité principale le CV, exemple ci-dessous:
protected override void OnResume()
{
base.OnResume();
Task startupWork = new Task(() => { SimulateStartup(); });
startupWork.Start();
}
// Simulates background work that happens behind the splash screen
async void SimulateStartup()
{
var intent = new Intent(this, typeof(MainActivity));
if (Intent.Extras != null)
{
intent.PutExtras(Intent.Extras); // copy Push info from splash to main
}
StartActivity(intent);
}
dans la nouvelle méthode d'intention de l'activité principale, vous pouvez obtenir les détails. échantillon ci-dessous,
protected override void OnNewIntent(Intent intent)
{
base.OnNewIntent(intent);
var type = intent.GetStringExtra("type");
if ((!string.IsNullOrEmpty(type) && object.Equals(type, "notification")))
{
// do your logic
}
}
Lorsque l'application est supprimée ou n'est pas en arrière-plan, dans ce cas, OnNewIntent Mentod n'est pas appelé. il n’est appelé que lorsque l’écran existant est en arrière-plan (c’est-à-dire que l’intention déjà existante est en arrière-plan) et que vous déclenchez une nouvelle intention pour faire avancer cet écran (je n’ai peut-être pas utilisé les mots techniques corrects, j'essaie simplement d'expliquer le concept)
Dans votre cas, OnCreate est appelé car l'application n'est pas en arrière-plan, vous devez donc la gérer à partir de là.
Essayez de déplacer l'appel d'intention de processus sous la méthode LoadApplication dans oncreate .
Ex:
LoadApplication(new App());
FirebasePushNotificationManager.ProcessIntent(this,Intent)
- OR -
Je suggérerais d'analyser l'intention de la méthode OnCreate et de transmettre les informations nécessaires en tant que paramètres à la classe APP via le constructeur chaque fois qu'une notification est cliquée .
Ex .: LoadApplication(new App('imp data that you want'));
À partir de la classe App, vous pouvez naviguer d’utilisateur à n’importe où vous voulez sans perturber la pile arrière de l’application.