c# - 如何让我的应用在加载但未在前台运行时发送通知?
问题描述
我有一个有时会使用的应用程序。我一定是在睡觉前把它留在了后台。当我醒来时,我在屏幕上看到了这个通知。
有人对我如何在我的XF应用程序中显示这样的通知有任何建议吗?
此外,这些通知是否也会出现在Android上?我从未在我的Android手机上看到过它们,但这可能是因为我使用它的次数少得多。
解决方案
我们可以使用Shiny.Notifications NuGet 包在 Xamarin.Forms 中创建跨平台的本地通知
示例应用
可以在此处找到使用以下代码创建的完整示例应用程序:https ://github.com/brminnick/LocalNotificationsSample
演练
1. 安装 Shiny.Notifications
将Shiny.Notifications NuGet 包 v1.2.0.1755添加到 Xamarin.Forms 项目、Xamarin.iOS 项目和 Xamarin.Android 项目。
2. 初始化 Shiny.Notifications
安卓
在[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
In AppDelegate.cs
, in 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);
}
}
}
推荐阅读
- sql - 无法使用 string_agg 将字符串数组连接到字符串
- arrays - React:更新数组元素而不重新渲染其他数组元素
- codeigniter - 如何在 CodeIgniter 中使用复选框输入多个值?
- python - 如何在不单击鼠标的情况下执行 python tkinter 按钮?
- redis - Redis 多重持久化策略
- primeng - Primeng 表响应宽度
- java - Spring security oAuth2.0 使用 Twitter 进行身份验证
- python - 在图中找到负循环
- python - 在python中逐组枚举
- html - 我们可以仅使用 CSS 为段落文本(50%-50%)着色,而不使用任何内联标签或任何其他脚本语言吗?