Xamarin.iOS 中的通知管理
在 iOS 12 中,操作系统可以从通知中心和“设置”应用深层链接到应用的通知管理屏幕。 此屏幕应允许用户选择加入和退出应用发送的各种通知。
通知管理屏幕
在示例应用中,ManageNotificationsViewController
定义允许用户独立启用和禁用红色通知和绿色通知的用户界面。 它是一个标准 UIViewController
,包含针对每个通知类型的 UISwitch
。 切换任一类型通知的开关都会在用户默认值中保存用户对该类型通知的首选项:
partial void HandleRedNotificationsSwitchValueChange(UISwitch sender)
{
NSUserDefaults.StandardUserDefaults.SetBool(sender.On, RedNotificationsEnabledKey);
}
注意
通知管理屏幕还会检查用户是否已完全禁用应用的通知。 如果是这样,它将隐藏各个通知类型的切换。 为此,通知管理屏幕会执行以下操作:
- 调用
UNUserNotificationCenter.Current.GetNotificationSettingsAsync
并检查AuthorizationStatus
属性。 - 如果已为应用完全禁用通知,则隐藏各个通知类型的切换。
- 请在应用程序每次移动到前台时重新检查是否已禁用通知,因为用户可以随时在 iOS 设置中启用/禁用通知。
示例应用的 ViewController
类(用于发送通知)会在发送本地通知之前检查用户的首选项,以确保通知是用户实际想要接收的类型:
partial void HandleTapRedNotificationButton(UIButton sender)
{
bool redEnabled = NSUserDefaults.StandardUserDefaults.BoolForKey(ManageNotificationsViewController.RedNotificationsEnabledKey);
if (redEnabled)
{
// ...
深层链接
iOS 可以从通知中心和“设置”应用中的应用通知设置深层链接到应用的通知管理屏幕。 为此,应用必须执行以下操作:
- 通过将
UNAuthorizationOptions.ProvidesAppNotificationSettings
传递给应用的通知授权请求,指示通知管理屏幕可用。 - 从
IUNUserNotificationCenterDelegate
实现OpenSettings
方法。
授权请求
若要向操作系统指示通知管理屏幕可用,应用应将 UNAuthorizationOptions.ProvidesAppNotificationSettings
选项(以及它所需的任何其他通知传送选项)传递给 UNUserNotificationCenter
上的 RequestAuthorization
方法。
例如,在示例应用的 AppDelegate
中:
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
// Request authorization to send notifications
UNUserNotificationCenter center = UNUserNotificationCenter.Current;
var options = UNAuthorizationOptions.ProvidesAppNotificationSettings | UNAuthorizationOptions.Alert | UNAuthorizationOptions.Sound | UNAuthorizationOptions.Provisional;
center.RequestAuthorization(options, (bool success, NSError error) =>
{
// ...
OpenSettings 方法
OpenSettings
方法(由系统调用以深层链接到应用的通知管理屏幕)应将用户直接导航到该屏幕。
在示例应用中,此方法在必要时对 ManageNotificationsViewController
执行 segue:
[Export("userNotificationCenter:openSettingsForNotification:")]
public void OpenSettings(UNUserNotificationCenter center, UNNotification notification)
{
var navigationController = Window.RootViewController as UINavigationController;
if (navigationController != null)
{
var currentViewController = navigationController.VisibleViewController;
if (currentViewController is ViewController)
{
currentViewController.PerformSegue(ManageNotificationsViewController.ShowManageNotificationsSegue, this);
}
}
}