wake-up-neo.com

Bestimmte Ansicht wird beim Benachrichtigungs-Tap nicht geöffnet, wenn die App beendet wird

Ich arbeite an Push-Benachrichtigungen in Xamarin.Forms mit Plugin.FirebasePushNotification . Benachrichtigungen werden nicht geöffnet, wenn die App beendet wird (von der Taskleiste beendet).

Wenn die App geöffnet ist oder sich im Hintergrund befindet, kann ich durch Klicken auf Benachrichtigung ..__ zu einer bestimmten Seite navigieren. Dies ist die Anwendungsklasse

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;
    }
}

MainActivity-Klasse

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);
}

App.xaml.cs-Klasse in einem freigegebenen Projekt

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"]}")
            });
        });
        }
    };
}

Dies ist die Nutzlast, die ich von Postman sende.

{ 
 "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",
}
}

Dies ist meine Schulklasse 

<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>

Ich habe diese Ausgabe auch auf GitHub zugewiesen. Vielen Dank.

7
CGPA6.4

Nun, ich bin mir nicht wirklich sicher, wo das Problem liegen könnte. Wenn wir uns jedoch die Dokumente ansehen: https://github.com/CrossGeeks/FirebasePushNotificationPlugin/blob/master/docs/GettingStarted.md , gibt es mehrere Möglichkeiten, die Sie ausprobieren können.

Stellen Sie zunächst Exported = true und LaunchMode = LaunchMode.SingleTop in Ihre MainActivity ein. Auch setze FirebasePushNotificationManager.ProcessIntent(this, Intent); in Ihrer onCreate(), direkt nach LoadApplication(new App());.

Beachten Sie, dass Sie ab Android 8.0 auch DefaultNotificationChannelId und DefaultNotificationChannelName in der onCreate() Ihrer Anwendung festlegen müssen.

Wenn Sie eine SplashActivity haben, stellen Sie sicher, dass Sie MainLauncher = true, NoHistory = true und den folgenden Code in onCreate() hinzufügen:

var mainIntent = new Intent(Application.Context, typeof(MainActivity));

 if (Intent.Extras != null) {
     mainIntent.PutExtras(Intent.Extras);
 }
 mainIntent.SetFlags(ActivityFlags.SingleTop);
 StartActivity(mainIntent);

Ich würde Ihnen auch empfehlen, sich den folgenden Ordner des Repos anzusehen: https://github.com/CrossGeeks/FirebasePushNotificationPlugin/tree/master/samples/FirebasePushSample/FirebasePushSample.Android . Wenn Sie den gesamten Code sorgfältig befolgen, sollte er funktionieren.

0

wenn Ihre Aktivität vor der Hauptaktivität aktiv ist, senden Sie die Push-Info an die Hauptaktivität im Lebenslauf. Beispiel unten:

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);
    }

in der neuen Intent-Methode der Hauptaktivität können Sie die Details abrufen. Probe unten,

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

Wenn die Anwendung beendet oder nicht im Hintergrund ausgeführt wird, wird OnNewIntent Mentod nicht aufgerufen. Es wird nur aufgerufen, wenn der vorhandene Bildschirm im Hintergrund ist (d. h. die bereits vorhandene Absicht ist im Hintergrund) und Sie eine neue Absicht auslösen, um diesen Bildschirm nach vorne zu bringen. (Ich habe möglicherweise nicht die richtigen technischen Wörter verwendet, sondern versucht nur, das Konzept zu erklären.)

In Ihrem Fall wird OnCreate aufgerufen, da sich die App nicht im Hintergrund befindet. 

Versuchen Sie, den Aufruf des Process Intents unter der Methode LoadApplication in oncreate ..__ zu verschieben.

Ex: 

LoadApplication(new App());
FirebasePushNotificationManager.ProcessIntent(this,Intent)

- OR -

Ich würde vorschlagen, die Absicht in der OnCreate-Methode zu analysieren und die erforderlichen Informationen als Parameter an die APP-Klasse über den Konstruktor zu übergeben, wenn auf eine Benachrichtigung geklickt wird .

Bsp .: LoadApplication(new App('imp data that you want'));

Von der App-Klasse aus können Sie den Benutzer zu einem beliebigen Ort navigieren, ohne den hinteren Stapel der Anwendung zu stören.

0
Suraj Jadhav