Wie kann ich meine App dazu bringen, Benachrichtigungen zu senden, wenn sie geladen ist, aber nicht im Vordergrund ausgeführt wird?

8

Ich habe eine App, die ich manchmal benutze. Ich muss es dort im Hintergrund gelassen haben, bevor ich geschlafen habe. Als ich aufwachte, sah ich diese Benachrichtigung auf meinem Bildschirm.

Geben Sie hier die Bildbeschreibung ein

Hat jemand Vorschläge, wie ich eine solche Benachrichtigung mit meiner XF- Anwendung anzeigen kann ?

Werden diese Benachrichtigungen auch auf Android angezeigt? Ich habe sie noch nie auf meinem Android- Handy gesehen, aber das könnte daran liegen, dass ich sie viel weniger benutze.

Alan2
quelle
Versuchen Sie es hier .
Andrew
Werden diese Benachrichtigungen auch auf Android angezeigt? Ja, und meistens werden sie nicht gesucht. Wenn Sie sie also selbst implementieren, verwenden Sie sie bitte kaum.
Bram Vanroy
Lassen Sie uns wissen, ob eine der vorgestellten Lösungen nicht funktioniert! :)
Saamer
Versuchen Sie, lokale Benachrichtigungen anzuzeigen, sobald die App startet?
Anubhav Ranjan
Hallo @ Alan2! Lassen Sie mich unten wissen, wenn Sie Fragen zu meiner Antwort haben! Wenn es Ihre Frage gelöst hat, markieren Sie es bitte als beantwortet, um anderen Entwicklern in Zukunft zu helfen!
Brandon Minnick

Antworten:

9

Wir können das Shiny.Notifications NuGet-Paket verwenden , um plattformübergreifende lokale Benachrichtigungen in Xamarin.Forms zu erstellen

Beispiel App

Eine fertige Beispiel-App, die mit dem folgenden Code erstellt wurde, finden Sie hier: https://github.com/brminnick/LocalNotificationsSample

Exemplarische Vorgehensweise

1. Installieren Sie Shiny.Notifications

Fügen Sie das Shiny.Notifications NuGet-Paket zu Ihrem Xamarin.Forms-Projekt, Ihrem Xamarin.iOS-Projekt und Ihrem Xamarin.Android-Projekt hinzu.

2. Initialisieren Sie Shiny.Notifications

Android

Initialisieren Sie in der [Application]Klasse in OnCreateShiny durch Aufrufen Shiny.AndroidShinyHost.Initund setzen Sie das Symbol durch Aufrufen von 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";
        }
    }
}

In MainActivity.cs, in OnRequestPermissionerlauben Glänzendes heutige Anforderungsnachricht Berechtigungen von dem Benutzer durch HinzufügenShiny.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

Initialisieren Sie Shiny in AppDelegate.cs, in FinishedLaunching, indem Sie Folgendes aufrufen 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. Planen Sie eine lokale Benachrichtigung

In diesem Beispiel senden wir sofort eine lokale Benachrichtigung und planen eine, die eine Minute nach dem Start der App gesendet wird

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

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

https://github.com/brminnick/LocalNotificationsSample

Brandon Minnick
quelle
Kann ich dich etwas fragen? Wissen Sie, wie man Shiny.Notificationsmit einem Vordergrunddienst arbeitet? Ich meine mit der StartForeground(int id, Android.App.Notification notification)Methode, bei der die Benachrichtigung als Android.App.Notification?
Elisabeth
2

Sie können verwenden Notifications, um diese Funktion zu erreichen. Aus dem Dokument Lokale Benachrichtigungen in Xamarin.Forms finden wir:

Lokale Benachrichtigungen sind Warnungen, die von Anwendungen gesendet werden, die auf einem mobilen Gerät installiert sind. Lokale Benachrichtigungen werden häufig für folgende Funktionen verwendet:

  • Listenpunkt
  • Kalenderereignisse
  • Erinnerungen

Standortbasierte Trigger Jede Plattform behandelt die Erstellung, Anzeige und Verwendung lokaler Benachrichtigungen unterschiedlich.

Sie können eine plattformübergreifende API definieren, mit der die Anwendung mit Benachrichtigungen interagieren kann.

  public interface INotificationManager
{
    event EventHandler NotificationReceived;

    void Initialize();

    int ScheduleNotification(string title, string message);

    void ReceiveNotification(string title, string message);
}

Weitere Informationen finden Sie im obigen Dokument. Dieser Link enthält auch ein Beispiel zu Benachrichtigungen. Er sollte für Sie hilfreich sein.

Wenn Sie möchten, dass Ihre App eine Benachrichtigung sendet, wenn sich die App im Hintergrund befindet, können Sie natürlich Hintergrundaufgaben verwenden.

Weitere Informationen finden Sie unter:

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
quelle