Определенный вид не открывается при нажатии уведомления, когда приложение закрывается - PullRequest
0 голосов
/ 03 декабря 2018

Я работаю над push-уведомлениями в Xamarin.Forms, используя Plugin.FirebasePushNotification.Уведомления не открывают определенный вид, когда приложение закрывается (убивается с панели задач).

Когда приложение открыто или в фоновом режиме, я могу перейти на определенную страницу при нажатии на уведомление.Это класс приложения

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

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 в общем проекте

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

Это полезная нагрузка, которую я отправляю с Почтальон

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

Это мой самый явный класс

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

Я также назначил этот выпуск на GitHub.Спасибо.

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Когда приложение убито или не находится в фоновом режиме, тогда в этом случае OnNewIntent Mentod не вызывается.он вызывается только тогда, когда существующий экран находится в фоновом режиме (то есть уже существующее намерение находится в фоновом режиме), и вы запускаете новое намерение перенести этот экран вперед (возможно, я не использовал правильные технические слова, просто пытаясь объяснить концепцию)

В вашем случае OnCreate вызывается, так как приложение не находится в фоновом режиме, поэтому вам нужно обработать его оттуда,

Попробуйте переместить вызов намерения процесса ниже метода LoadApplication в oncreate.Пример:

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

- ИЛИ -

Я бы предложил проанализировать намерение в методе OnCreate и передать необходимую информацию в качестве параметров классу APP через конструктор при каждом нажатии на уведомление.Пример: LoadApplication(new App('imp data that you want'));

Из класса приложения вы можете перемещать пользователя в любое удобное для вас место, не нарушая задний стек приложения.

0 голосов
/ 12 декабря 2018

Ну, я не совсем уверен, где проблема может быть.Однако, если мы посмотрим на документы: https://github.com/CrossGeeks/FirebasePushNotificationPlugin/blob/master/docs/GettingStarted.md,, есть несколько вещей, которые вы можете попробовать.

Прежде всего установите Exported = true и LaunchMode = LaunchMode.SingleTop в вашем MainActivity. Также установите FirebasePushNotificationManager.ProcessIntent(this, Intent); в вашем onCreate(), сразу после LoadApplication(new App());.

Обратите внимание, что начиная с Android 8.0, вы должны установить DefaultNotificationChannelId и DefaultNotificationChannelNameв onCreate() вашего приложения.

Затем, если у вас есть SplashActivity, убедитесь, что вы добавили MainLauncher = true, NoHistory = true к нему и следующий код в onCreate():

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

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

Я бы также порекомендовал вам взглянуть на следующую папку репо: https://github.com/CrossGeeks/FirebasePushNotificationPlugin/tree/master/samples/FirebasePushSample/FirebasePushSample.Android. Если вы внимательно следите за всем кодом, он должен работать.

0 голосов
/ 10 декабря 2018

если у вас есть всплеск активности перед основной деятельностью, а затем отправьте push-информацию основной деятельности в резюме, образец ниже:

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

в новом методе намерения основной деятельности, вы можете получитьподробности.образец ниже,

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

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...