在敏捷开发环境中,无论是与用户、客户还是产品所有者合作,明确每个平台能够提供的原生应用功能都是非常重要的。本文将介绍如何在Xamarin.Forms项目中实现跨平台通知功能,包括iOS、Android和UWP/WinRT平台的原生通知处理方法。
要实现本文中的功能,需要具备以下背景知识:
Toasts.Forms.Plugin是一个简单的插件,可以在Xamarin.Forms项目中使用。对于iOS开发者来说,它与原生Toast或通知API非常相似。
在原生环境中,iOS使用UNNotificationRequest对象来管理通知,而Android则使用Snackbar来显示简单的消息并在一段时间后消失。对于UWP/WinRT,它使用ToastNotification,可以包含文本或图像。
可以通过Visual Studio 2017的NuGet包管理器控制台为每个平台安装此插件,包括可移植库,因为它使用依赖服务。
安装命令如下:
Install-Package Toasts.Forms.Plugin -Version 3.3.2
或者,可以在Nuget包管理器中搜索Toasts.Forms.Plugin并点击安装。
根据项目GitHub描述,需要在每个平台(Android、iOS或UWP/WinRT)注册依赖项。
对于每个项目,需要在MainActivity.cs或MainPage.cs中添加以下引用:
using Xamarin.Forms;
using Plugin.Toasts;
对于Android,此代码将添加到MainActivity.OnCreate的末尾,以注册依赖项并初始化它:
DependencyService.Register();
ToastNotification.Init(this);
对于iOS,需要添加请求权限以显示通知:
if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0)) {
UNUserNotificationCenter.Current.RequestAuthorization(UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound, (granted, error) => {
// 处理问题
});
} else if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) {
var notificationSettings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, null);
app.RegisterUserNotificationSettings(notificationSettings);
}
现在,可以在应用程序的任何地方调用通知。首先,定义通知选项,如标题、描述,这是INotificationOptions接口:
public interface INotificationOptions {
string Title { get; }
string Description { get; }
bool IsClickable { get; }
IWindowsOptions WindowsOptions { get; }
IAndroidOptions AndroidOptions { get; }
IiOSOptions iOSOptions { get; }
}
接下来,定义一个NotificationOptions实例:
var options = new NotificationOptions() {
Title = "显示通知",
Description = "与此标题相关的一些描述...",
IsClickable = false // 如果需要结果点击返回,请设置为true(如果用户点击它)
};
使用依赖服务来解析IToastNotificator:
var notification = DependencyService.Get();
var result = await notification.Notify(options);
结果将返回一个NotificationResult,其中包含一个Action,具有以下值之一:
[Flags]
public enum NotificationAction {
Timeout = 1, // 隐藏自身
Clicked = 2, // 用户点击通知
Dismissed = 4, // 用户手动关闭通知
ApplicationHidden = 8, // 应用程序进入后台
Failed = 16 // 显示Toast失败
}
警告框是一个弹出窗口,与通知不同,因为它有一个按钮(确定或确定/取消)。
示例:
DisplayAlert("警告!", "这是第一个警告", "确定");
或者:
var answer = await DisplayAlert("第一个问题", "知道通知在Xamarin中吗?", "是", "否");
Debug.WriteLine("答案: " + answer);
使用了Acr.UserDialogs插件,由Allan Ritchie开发。它是一种新的方式来使用弹出窗口,与Toast和Alert的设计有所不同。
GitHub文档中提到,它允许开发者“从共享/可移植库调用标准用户对话框,包括操作表、警告、确认、加载、登录、进度、提示、Toast”。