Xamarin.iOS 中的通知管理

在 iOS 12 中,操作系统可以从通知中心和“设置”应用深层链接到应用的通知管理屏幕。 此屏幕应允许用户选择加入和退出应用发送的各种通知。

通知管理屏幕

在示例应用中,ManageNotificationsViewController 定义允许用户独立启用和禁用红色通知和绿色通知的用户界面。 它是一个标准 UIViewController,包含针对每个通知类型的 UISwitch。 切换任一类型通知的开关都会在用户默认值中保存用户对该类型通知的首选项:

partial void HandleRedNotificationsSwitchValueChange(UISwitch sender)
{
    NSUserDefaults.StandardUserDefaults.SetBool(sender.On, RedNotificationsEnabledKey);
}

注意

通知管理屏幕还会检查用户是否已完全禁用应用的通知。 如果是这样,它将隐藏各个通知类型的切换。 为此,通知管理屏幕会执行以下操作:

示例应用的 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);
        }

    }
}