c# - 如何让我的应用程序在加载但未在前台运行时发送通知?

标签 c# xamarin xamarin.forms xamarin.android xamarin.ios

我有一个有时会使用的应用程序。我一定是在 sleep 前把它留在了后台。当我醒来时,我在屏幕上看到了这条通知。

enter image description here

有人对如何在我的 XF 应用程序中显示这样的通知有任何建议吗?

此外,这些通知也会出现在 Android 上吗?我从未在我的 Android 手机上见过它们,但这可能是因为我使用它的次数少得多。

最佳答案

我们可以使用Shiny.Notifications NuGet Package在 Xamarin.Forms 中创建跨平台本地通知

示例应用

可以在此处找到使用以下代码创建的完整示例应用程序:https://github.com/brminnick/LocalNotificationsSample

演练

1。安装 Shiny 的通知

添加Shiny.Notifications NuGet Package v1.2.0.1755到您的 Xamarin.Forms 项目、Xamarin.iOS 项目和 Xamarin.Android 项目。

2。初始化Shiny.Notifications

安卓

[Application]类,在 OnCreate ,通过调用 Shiny.AndroidShinyHost.Init 初始化 Shiny并通过调用 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.AndroidShinyHost.OnRequestPermissionsResult(requestCode, permissions, grantResults); 允许 Shiny 呈现来自用户的请求通知权限

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.iOSShinyHost.Init 初始化 Shiny :

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

关于c# - 如何让我的应用程序在加载但未在前台运行时发送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59622443/

相关文章:

xamarin - 我可以将 Xamarin 与 NokiaX 一起使用吗

c# - Xamarin.Forms 中的仅小写输入

c# - Wpf 中菜单项的选择性样式

c# - COM dll 的有效 .cs 文件

c# - 在 ListViewItem C# 中添加多于 2 个图像

android - 如何在 Xamarin Android 应用程序中将日志输出到 SD 卡上的文件?

ios - xamarin IOS 设计器不能约束 super View 边缘?

c# - MongoDB GetCollection 方法是否将整个集合加载到 RAM 或引用中? C#

xamarin - [QueryProperty ("Name", "name")] 在 Xamarin Shell 应用程序中的用途是什么?

c# - 更改 Xamarin 中单页的导航栏颜色