OneSignal Xamarin.Forms HandleNotificationOpened重定向到通知特定页面

时间:2018-07-18 08:39:29

标签: xamarin xamarin.forms xamarin.android onesignal

在我的Xamarin.Forms项目中,我使用OneSignal进行通知。在iOS中, Xamarin.Forms.Application.Current.MainPage = new NavigationPage(new NotificationPage()); 起作用,但在Android中则不起作用。我试图使用消息传递中心与PCL项目进行通信。该应用程序在后台运行时有效,但在应用程序关闭时不运行。在Android中收到通知时,如何重定向通知特定页面?谢谢

注意:已编辑代码并解决了问题,我使用共享的首选项来控制应用是否从通知中启动。然后,我加载xamarin.Forms应用程序。

2 个答案:

答案 0 :(得分:0)

在调用LoadApplication()方法之前,可以使用以下方法。

if (Intent.Extras != null)
        {
            foreach (var key in Intent.Extras.KeySet())
            {
                if (key != null)
                {
                    var value = Intent.Extras.GetString(key);                        
                    Log.Debug(TAG, "Key: {0} Value: {1}", key, value);
                }
            }
        }

 LoadApplication(new App());

您必须在OnMessageReceivedMethod()中设置intent.putExtra()方法。

intent.PutExtra("Key", "value");

然后,您可以基于此键值在App.xaml.cs文件中使用重定向。因为在android中,在重新初始化应用程序时打开通知的情况。

我认为您不需要设置以下条件。

 if (extrasList[0] == "true")
    {
        LoadApplication(new App(true));

    }
    else
    {
        LoadApplication(new App(false));

    }

首先存储您的值全局级别,以便可以在App.cs文件中使用它。只需使用以下代码即可处理App()类中的页面导航。

 if (Device.RuntimePlatform == Device.Android)
                {
                    if (YourKey == "true")
                    {
                       //handle that page navigation
                    }
                    else
                    {
                       //Default Page of App
                    }
                }

答案 1 :(得分:0)

注意:已编辑代码并解决了问题,我使用共享首选项来控制应用是否从通知启动。然后我加载xamarin.Forms应用程序

public class MainActivity : 
global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{



 protected override void OnCreate(Bundle bundle)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(bundle);
        InitializeUI();

        global::Xamarin.Forms.Forms.Init(this, bundle);
        global::Xamarin.FormsMaps.Init(this, bundle);

        ImageCircleRenderer.Init();
        tV = new TextView(this);
        resources = this.Resources;


        OneSignal.Current.StartInit("***APP ID***")
           .InFocusDisplaying(OSInFocusDisplayOption.Notification)
           .HandleNotificationReceived(HandleNotificationReceived)
            .HandleNotificationOpened(HandleNotificationOpened)
             .EndInit();


        ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this);
        var LaunchFromNotification = prefs.GetString("is_notification_received", "false");
        if (LaunchFromNotification == "true")
        {
            LoadApplication(new App(true));

        }
        else
        {
            LoadApplication(new App(false));

        }

        OneSignal.Current.IdsAvailable(IdsAvailable); //Lets you retrieve the OneSignal player id and push token.
    }

}
        private static void HandleNotificationOpened(OSNotificationOpenedResult result)
    {
        ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(Android.App.Application.Context);
        ISharedPreferencesEditor editor = prefs.Edit();
        editor.PutString("is_notification_received", "true");
        editor.Apply();

    }
protected override void OnResume()
       {
            base.OnResume();
            ISharedPreferences prefs = 
     PreferenceManager.GetDefaultSharedPreferences(this);

        ISharedPreferencesEditor editor = prefs.Edit();
        editor.Remove("is_notification_received");
        editor.PutString("is_notification_received", "false");
        editor.Apply();
    }