web-dev-qa-db-fra.com

La vue spécifique ne s'ouvre pas à la notification, appuyez sur lorsque l'application est fermée

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.

7
CGPA6.4

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.

0
Giovanni Terlingen

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

        }
    }
0
Abdul Gani

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.

0
Suraj Jadhav