我有一个有时会使用的应用程序。我一定是在 sleep 前把它留在了后台。当我醒来时,我在屏幕上看到了这条通知。
有人对如何在我的 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);
}
}
}
关于c# - 如何让我的应用程序在加载但未在前台运行时发送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59622443/