How can I make my app send out notifications when it's loaded but not running in the foreground?

不羁岁月 提交于 2020-02-27 06:28:49

问题


I have an app that I use sometimes. I must have left it there in the background before I slept. When I woke up I saw this notification on my screen.

Does anyone have any suggestions on how I can make a notification like this appear with my XF application?

Also, do these notifications appear on Android also? I've never seen them on my Android phone but that could be because I use it much less.


回答1:


We can use Shiny.Notifications NuGet Package to create cross-platform Local Notifications in Xamarin.Forms

Sample App

A completed sample app created using the code below can be found here: https://github.com/brminnick/LocalNotificationsSample

Walkthrough

1. Install Shiny.Notifications

Add the Shiny.Notifications NuGet Package to your Xamarin.Forms project, your Xamarin.iOS project and Xamarin.Android project.

2. Initialize Shiny.Notifications

Android

In the [Application] class, in OnCreate, initialize Shiny by calling Shiny.AndroidShinyHost.Init and setting its icon by calling 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 OnRequestPermission, add the allow Shiny to present request notifications permissions from the user by adding 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

In AppDelegate.cs, in FinishedLaunching, initialize Shiny by calling 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. Schedule a Local Notification

In this example, we will send a Local Notification immediately and schedule one to be sent one minute after the app launches

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




回答2:


You can use Notifications to achieve this function. From document Local notifications in Xamarin.Forms,we will find:

Local notifications are alerts sent by applications installed on a mobile device. Local notifications are often used for features such as:

  • List item
  • Calendar events
  • Reminders

Location-based triggers Each platform handles the creation, display, and consumption of local notifications differently.

You can defines a cross-platform API that the application can use to interact with notifications.

  public interface INotificationManager
{
    event EventHandler NotificationReceived;

    void Initialize();

    int ScheduleNotification(string title, string message);

    void ReceiveNotification(string title, string message);
}

For more details, you can check above document, and this link also contains a sample about Notifications.It should be helpful for you.

Of course, if you want your app send notification when app is in background, you can use background-tasks.

For more details,you can check:

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/



来源:https://stackoverflow.com/questions/59622443/how-can-i-make-my-app-send-out-notifications-when-its-loaded-but-not-running-in

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!