Como posso fazer com que meu aplicativo envie notificações quando está carregado, mas não está sendo executado em primeiro plano?

8

Eu tenho um aplicativo que eu uso algumas vezes. Devo ter deixado lá no fundo antes de dormir. Quando acordei, vi esta notificação na minha tela.

insira a descrição da imagem aqui

Alguém tem alguma sugestão sobre como fazer uma notificação como essa aparecer com meu aplicativo XF ?

Além disso, essas notificações também aparecem no Android ? Eu nunca os vi no meu telefone Android, mas isso pode ser porque eu o uso muito menos.

Alan2
fonte
Tente aqui .
Andrew
Além disso, essas notificações também aparecem no Android? Sim, e mais frequentemente do que não, eles não são desejados. Portanto, quando você implementá-los, use-os mal.
Bram Vanroy 10/01
Deixe-nos saber se alguma das soluções apresentadas não funciona! :)
Saamer
Você está tentando mostrar notificações locais assim que o aplicativo é iniciado?
Anubhav Ranjan 16/01
Oi @ Alan2! Deixe-me saber se você tiver alguma dúvida sobre a minha resposta, abaixo! Se a sua pergunta foi resolvida, marque-a como Respondida para ajudar outros desenvolvedores no futuro!
Brandon Minnick 18/01

Respostas:

9

Podemos usar o Pacote NuGet do Shiny.Notifications para criar Notificações Locais entre plataformas no Xamarin.Forms

Sample App

Um exemplo de aplicativo completo criado usando o código abaixo pode ser encontrado aqui: https://github.com/brminnick/LocalNotificationsSample

Passo a passo

1. Instale o Shiny.Notifications

Adicione o pacote NuGet Shiny.Notifications ao seu projeto Xamarin.Forms, seu projeto Xamarin.iOS e projeto Xamarin.Android.

2. Inicialize o Shiny.Notifications

Android

Na [Application]classe, em OnCreate, inicialize o Shiny chamando Shiny.AndroidShinyHost.Inite definindo seu ícone chamando 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";
        }
    }
}

Em MainActivity.cs, em OnRequestPermission, permita que o Shiny apresente permissões de notificação de solicitação ao usuário adicionandoShiny.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

In AppDelegate.cs, in FinishedLaunching, inicialize o Shiny chamando 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. Agende uma notificação local

Neste exemplo, enviaremos uma notificação local imediatamente e agendaremos uma para ser enviada um minuto após o lançamento do aplicativo

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

insira a descrição da imagem aqui insira a descrição da imagem aqui

https://github.com/brminnick/LocalNotificationsSample

Brandon Minnick
fonte
Posso lhe fazer uma pergunta? Você sabe como usar Shiny.Notificationscom um serviço em primeiro plano? Quero dizer com o StartForeground(int id, Android.App.Notification notification)método em que a notificação deve ser fornecida como um Android.App.Notification?
Elisabeth
2

Você pode usar Notificationspara alcançar esta função. Do documento Notificações locais no Xamarin.Forms , encontraremos:

As notificações locais são alertas enviados por aplicativos instalados em um dispositivo móvel. As notificações locais são frequentemente usadas para recursos como:

  • Item da lista
  • Eventos do calendário
  • Lembretes

Gatilhos baseados em localização Cada plataforma lida com a criação, exibição e consumo de notificações locais de maneira diferente.

Você pode definir uma API de plataforma cruzada que o aplicativo pode usar para interagir com as notificações.

  public interface INotificationManager
{
    event EventHandler NotificationReceived;

    void Initialize();

    int ScheduleNotification(string title, string message);

    void ReceiveNotification(string title, string message);
}

Para obter mais detalhes, você pode verificar o documento acima, e este link também contém uma amostra sobre as Notificações. Isso deve ser útil para você.

Obviamente, se você quiser que seu aplicativo envie uma notificação quando o aplicativo estiver em segundo plano, poderá usar tarefas em segundo plano.

Para mais detalhes, você pode verificar:

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

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

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

Jessie Zhang -MSFT
fonte