Xamarin.iOS 中的分组通知

默认情况下,iOS 12 会将应用的所有通知放在一个组中。 锁屏界面和通知中心将该组堆叠显示,顶部是最新的通知。 用户可以展开该组以查看其包含的所有通知,并将该组作为一个整体关闭。

应用还可以按线程对通知进行分组,使用户更容易找到其感兴趣的特定信息并进行交互。

请求授权并允许前台通知

应用必须先请求权限才能发送本地通知。 在示例应用 AppDelegate 中,FinishedLaunching 方法请求此权限:

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    UNUserNotificationCenter center = UNUserNotificationCenter.Current;
    center.RequestAuthorization(UNAuthorizationOptions.Alert, (bool success, NSError error) =>
    {
        // Set the Delegate regardless of success; users can modify their notification
        // preferences at any time in the Settings app.
        center.Delegate = this;
    });
    return true;
}

UNUserNotificationCenterDelegate(如上所述)决定前台应用是否应通过调用传递给 WillPresentNotification 的完成事件处理器来显示传入通知:

[Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
public void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, System.Action<UNNotificationPresentationOptions> completionHandler)
{
    completionHandler(UNNotificationPresentationOptions.Alert);
}

UNNotificationPresentationOptions.Alert 参数指示应用应显示警报,但不播放声音或更新锁屏提醒。

线程化通知

反复点击示例应用的“与 Alice 的消息”按钮,使其发送与名为 Alice 的好友对话的通知。 由于此会话的通知属于同一线程,因此锁屏界面和通知中心将其组合在一起。

若要开始与其他好友的对话,请点击“选择新的好友”按钮。 此对话的通知将显示在单独的组中。

ThreadIdentifier

当示例应用启动新线程时,将会创建唯一的线程标识符:

void StartNewThread()
{
    threadId = $"message-{friend}";
    // ...
}

若要发送线程式通知,示例应用将:

async partial void ScheduleThreadedNotification(UIButton sender)
{
    var center = UNUserNotificationCenter.Current;

    UNNotificationSettings settings = await center.GetNotificationSettingsAsync();
    if (settings.AuthorizationStatus != UNAuthorizationStatus.Authorized)
    {
        return;
    }

    string author =  // ...
    string message = // ...

    var content = new UNMutableNotificationContent()
    {
        ThreadIdentifier = threadId,
        Title = author,
        Body = message,
        SummaryArgument = author
    };

    var request = UNNotificationRequest.FromIdentifier(
        Guid.NewGuid().ToString(),
        content,
        UNTimeIntervalNotificationTrigger.CreateTrigger(1, false)
    );

    center.AddNotificationRequest(request, null);

    // ...
}

来自同一应用的具有相同线程标识符的所有通知将显示在同一个通知组中。

注意

若要为远程通知设置线程标识符,请将 thread-id 密钥添加到通知的 JSON 有效负载。 有关更多详细信息,请参阅 Apple 的生成远程通知文档。

SummaryArgument

SummaryArgument 指定通知将如何影响通知所属通知组左下角显示的摘要文本。 iOS 聚合同一组通知中的摘要文本,以创建总体摘要描述。

示例应用使用消息的创建者作为摘要参数。 使用此方法,包含 Alice 的一组 6 个通知的摘要文本可能是来自 Alice 和 Me 的另外 5 个通知

非线程式通知

每次点击示例应用程序的“约会提醒”按钮,都会发送各种约会提醒通知之一。 由于这些提醒不是线程式提醒,因此它们将显示在锁屏界面和通知中心的应用程序级通知组中。

若要发送非线程式通知,示例应用的 ScheduleUnthreadedNotification 的方法使用与上面类似的代码。 但是,它不会设置 UNMutableNotificationContent 对象的 ThreadIdentifier