¿Cómo puedo hacer que mi aplicación envíe notificaciones cuando está cargada pero no se ejecuta en primer plano?

8

Tengo una aplicación que uso a veces. Debo haberlo dejado allí en el fondo antes de dormir. Cuando desperté vi esta notificación en mi pantalla.

ingrese la descripción de la imagen aquí

¿Alguien tiene alguna sugerencia sobre cómo puedo hacer que una notificación como esta aparezca con mi aplicación XF ?

Además, ¿ también aparecen estas notificaciones en Android ? Nunca los he visto en mi teléfono Android , pero eso podría ser porque lo uso mucho menos.

Alan2
fuente
Tratar aquí .
Andrew
Además, ¿también aparecen estas notificaciones en Android? Sí, y la mayoría de las veces no son deseados. Entonces, cuando los implemente usted mismo, úselos apenas.
Bram Vanroy
¡Háganos saber si alguna de las soluciones presentadas no funciona! :)
Saamer
¿Estás tratando de mostrar notificaciones locales tan pronto como se inicia la aplicación?
Anubhav Ranjan
Hola @ Alan2! ¡Avíseme si tiene alguna pregunta sobre mi respuesta, a continuación! Si resolvió su pregunta, asegúrese de marcarla como Respondida para ayudar a otros desarrolladores en el futuro.
Brandon Minnick

Respuestas:

9

Podemos usar Shiny.Notifications NuGet Package para crear notificaciones locales multiplataforma en Xamarin.Forms

Aplicación de muestra

Puede encontrar una aplicación de muestra completada con el siguiente código aquí: https://github.com/brminnick/LocalNotificationsSample

Tutorial

1. Instalar Shiny.Notifications

Agregue el paquete NuGet Shiny.Notifications a su proyecto Xamarin.Forms, su proyecto Xamarin.iOS y su proyecto Xamarin.Android.

2. Inicialice Shiny.Notifications

Androide

En la [Application]clase, en OnCreate, inicialice Shiny llamando Shiny.AndroidShinyHost.Inity estableciendo su icono llamando Shiny.Notifications.AndroidOptions.DefaultSmallIconResourceName:

using System;
using Android.App;
using Android.Runtime;
using Shiny;

namespace LocalNotificationsSample.Droid
{
    [Application]
    public class YourApplication : Application
    {
        public YourApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer)
        {
        }

        public override void OnCreate()
        {
            base.OnCreate();
            AndroidShinyHost.Init(this, platformBuild: services => services.UseNotifications());
            Notifications.AndroidOptions.DefaultSmallIconResourceName = "icon.png";
        }
    }
}

En MainActivity.cs, en OnRequestPermission, permite que Shiny presente permisos de notificaciones de solicitud del usuario agregandoShiny.AndroidShinyHost.OnRequestPermissionsResult(requestCode, permissions, grantResults);

using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;

namespace LocalNotificationsSample.Droid
{
    [Activity(Label = "LocalNotificationsSample", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            Shiny.AndroidShinyHost.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

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

            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
    }
}

iOS

En AppDelegate.cs, en FinishedLaunching, inicialice Shiny llamando Shiny.iOSShinyHost.Init:

using Foundation;
using UIKit;
using Shiny;

namespace LocalNotificationsSample.iOS
{
    [Register(nameof(AppDelegate))]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            iOSShinyHost.Init(platformBuild: services => services.UseNotifications());
            global::Xamarin.Forms.Forms.Init();
            LoadApplication(new App());

            return base.FinishedLaunching(app, options);
        }
    }
}

3. Programe una notificación local

En este ejemplo, enviaremos una Notificación local de inmediato y programaremos una para que se envíe un minuto después de que se inicie la aplicación

using System;
using System.Threading.Tasks;
using Shiny;
using Shiny.Notifications;
using Xamarin.Forms;

namespace LocalNotificationsSample
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            MainPage = new MainPage();
        }

        protected override async void OnStart()
        {
            await SendNotificationNow();
            await ScheduleLocalNotification(DateTimeOffset.UtcNow.AddMinutes(1));
        }

        Task SendNotificationNow()
        {
            var notification = new Notification
            {
                Title = "Testing Local Notifications",
                Message = "It's working",
            };

            return ShinyHost.Resolve<INotificationManager>().RequestAccessAndSend(notification);
        }

        Task ScheduleLocalNotification(DateTimeOffset scheduledTime)
        {
            var notification = new Notification
            {
                Title = "Testing Local Notifications",
                Message = "It's working",
                ScheduleDate = scheduledTime
            };

            return ShinyHost.Resolve<INotificationManager>().Send(notification);
        }
    }
}

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

https://github.com/brminnick/LocalNotificationsSample

Brandon Minnick
fuente
¿Puedo hacerte una pregunta? ¿Sabes cómo usar Shiny.Notificationscon un servicio en primer plano? Quiero decir con el StartForeground(int id, Android.App.Notification notification)método donde la notificación se debe proporcionar como un Android.App.Notification?
Elisabeth
2

Puede usar Notificationspara lograr esta función. De las notificaciones locales de documentos en Xamarin.Forms , encontraremos:

Las notificaciones locales son alertas enviadas por aplicaciones instaladas en un dispositivo móvil. Las notificaciones locales a menudo se usan para funciones como:

  • Elemento de la lista
  • Calendario de eventos
  • Recordatorios

Activadores basados ​​en la ubicación Cada plataforma maneja la creación, visualización y consumo de notificaciones locales de manera diferente.

Puede definir una API multiplataforma que la aplicación puede usar para interactuar con las notificaciones.

  public interface INotificationManager
{
    event EventHandler NotificationReceived;

    void Initialize();

    int ScheduleNotification(string title, string message);

    void ReceiveNotification(string title, string message);
}

Para obtener más detalles, puede consultar el documento anterior, y este enlace también contiene una muestra sobre Notificaciones. Debería serle útil.

Por supuesto, si desea que su aplicación envíe notificaciones cuando la aplicación esté en segundo plano, puede usar tareas en segundo plano.

Para más detalles, puede consultar:

https://xamarinhelp.com/xamarin-background-tasks/

https://docs.microsoft.com/zh-cn/xamarin/ios/app-fundamentals/backgrounding/

https://docs.microsoft.com/en-ie/xamarin/android/app-fundamentals/services/creating-a-service/

Jessie Zhang -MSFT
fuente