Как я могу заставить мое приложение отправлять уведомления, когда оно загружено, но не работает на переднем плане? - PullRequest
8 голосов
/ 07 января 2020

У меня есть приложение, которое я иногда использую. Должно быть, я оставил его там на заднем плане, прежде чем я заснул. Когда я проснулся, я увидел это уведомление на моем экране.

enter image description here

Есть ли у кого-нибудь какие-либо предложения о том, как сделать так, чтобы уведомление появлялось в моем приложении XF ?

Кроме того, эти уведомления появляются также на Android? Я никогда не видел их на своем Android телефоне, но это могло быть потому, что я использую его намного меньше.

Ответы [ 2 ]

9 голосов
/ 14 января 2020

Мы можем использовать Пакет Shiny.Notifications NuGet для создания кроссплатформенных локальных уведомлений в Xamarin.Forms

Образец приложения

Готовый пример приложения, созданный с использованием кода ниже можно найти здесь: https://github.com/brminnick/LocalNotificationsSample

Прохождение

1. Установите Shiny.Notifications

Добавьте пакет Shiny.Notifications NuGet в проект Xamarin.Forms, проект Xamarin. iOS и проект Xamarin. Android.

2. Инициализируйте Shiny.Notifications

Android

В классе [Application], в OnCreate, инициализируйте Shiny, вызывая Shiny.AndroidShinyHost.Init и устанавливая его значок, вызывая 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";
        }
    }
}

В MainActivity.cs, в OnRequestPermission, разрешите Shiny представлять разрешения на уведомления о запросах от пользователя, добавив Shiny.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

В AppDelegate.cs, в FinishedLaunching, инициализируйте Shiny, вызвав 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. Запланируйте локальное уведомление

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

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

enter image description here enter image description here

https://github.com/brminnick/LocalNotificationsSample

2 голосов
/ 07 января 2020

Вы можете использовать Notifications для достижения этой функции. Из документа Локальные уведомления в Xamarin.Forms мы найдем:

Локальные уведомления - это оповещения, отправляемые приложениями, установленными на мобильном устройстве. Локальные уведомления часто используются для таких функций, как:

  • Элемент списка
  • Календарь событий
  • Напоминания

Триггеры на основе местоположения Каждый Платформа обрабатывает создание, отображение и использование локальных уведомлений по-разному.

Вы можете определить кроссплатформенный API, который приложение может использовать для взаимодействия с уведомлениями.

  public interface INotificationManager
{
    event EventHandler NotificationReceived;

    void Initialize();

    int ScheduleNotification(string title, string message);

    void ReceiveNotification(string title, string message);
}

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

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

Для более подробной информации, вы можете проверить:

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/

...