Сгруппированные уведомлений в Xamarin.iOSGrouped notifications in Xamarin.iOS

По умолчанию iOS 12 помещает все уведомления приложения в группе.By default, iOS 12 places all of an app's notifications in a group. Блокировка экрана и центр уведомлений отображения в виде стека с последнего уведомления в верхней части этой группы.The lock screen and Notification Center display this group as a stack with the most recent notification on top. Пользователей можно развернуть в группу, чтобы все уведомления, она содержит и отклонить группы в целом см. в разделе.Users can expand the group to see all the notifications it contains and dismiss the group as a whole.

Приложения также могут группы уведомлений потоком, что упрощает для пользователей поиск и взаимодействовать с нужной информации им интересны.Apps can also group notifications by thread, making it easier for users to find and interact with the specific information they're interested in.

Пример приложения. GroupedNotificationsSample app: GroupedNotifications

Чтобы узнать, как использовать сгруппированные уведомления с помощью Xamarin.iOS, взгляните на GroupedNotifications примера приложения.To learn how to use grouped notifications with Xamarin.iOS, take a look at the GroupedNotifications sample app.

Этот пример приложения имитирует диалоги с различных друзьями, отправки уведомления для каждого сообщения и сгруппировать их потоком.This sample app simulates conversations with various friends, sending a notification for each message and grouping them by thread. Он также демонстрирует, как несвязанным land уведомления в группе уровня приложения.It also demonstrates how unthreaded notifications land in an application-level group.

Фрагменты кода, в этом руководстве, взяты из этого примера приложения.Code snippets in this guide come from this sample app.

Запросить авторизацию и разрешить уведомления переднего планаRequest authorization and allow foreground notifications

Приложения для отправки локального уведомления, оно должно запросить разрешение на это.Before an app can send local notifications, it must request permission to do so. В примере приложения AppDelegate , FinishedLaunching метод запрашивает это разрешение:In the sample app's AppDelegate, the FinishedLaunching method requests this permission:

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;
}

Delegate (Задайте выше) для UNUserNotificationCenter решает ли приложение переднего плана отобразится уведомление о входящих путем вызова обработчик завершения, передаваемый WillPresentNotification:The Delegate (set above) for a UNUserNotificationCenter decides whether or not a foreground app should display an incoming notification by calling the completion handler passed to WillPresentNotification:

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

UNNotificationPresentationOptions.Alert Параметр указывает, что приложение должно отображать сообщение, но не воспроизведение звука или обновить эмблему.The UNNotificationPresentationOptions.Alert parameter indicates that the app should show the alert but not play a sound or update a badge.

Многопоточные уведомленияThreaded notifications

Выберите пример приложения сообщение с Алисой кнопку несколько раз, чтобы их отправки уведомлений для диалога с именем Анна друзьям.Tap the sample app's Message with Alice button repeatedly to have it send notifications for a conversation with a friend named Alice. Так как этот диалог уведомления входят в том же потоке, блокировка экрана и центр уведомлений сгруппировать их вместе.Since this conversation's notifications are part of the same thread, the lock screen and Notification Center group them together.

Чтобы начать диалог с другой другом, коснитесь выберите запись нового друга кнопки.To start a conversation with a different friend, tap the Choose a new friend button. Уведомления для этого диалога, появляются в отдельную группу.Notifications for this conversation appear in a separate group.

ThreadIdentifierThreadIdentifier

Любое время, в примере приложения запускает новый поток, он создает идентификатор, уникальный поток:Any time the sample app starts a new thread, it creates a unique thread identifier:

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

Чтобы отправить уведомление потоками, пример приложения:To send a threaded notification, the sample app:

  • Проверяет, имеет ли приложение авторизации для отправки уведомления.Checks whether the app has authorization to send a notification.
  • Создает UNMutableNotificationContentCreates a UNMutableNotificationContent объект для уведомления содержимого и устанавливает его ThreadIdentifierobject for the notification's content and sets its ThreadIdentifier Идентификатор потока, созданный ранее.to the thread identifier created above.
  • Создает запрос и планирует уведомления:Creates a request and schedules the notification:
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);

    // ...
}

Все уведомления из одного приложения с тем же идентификатором потока будут отображаться в той же группе уведомлений.All notifications from the same app with the same thread identifier will appear in the same notification group.

Примечание

Чтобы задать идентификатор потока на удаленных уведомлений, добавьте thread-id ключа уведомления полезные данные JSON.To set a thread identifier on a remote notification, add the thread-id key to the notification's JSON payload. См. в разделе Apple созданием удаленного уведомления документа для получения дополнительных сведений.See Apple's Generating a Remote Notification document for more details.

SummaryArgumentSummaryArgument

SummaryArgument Указывает влияние текст сводки, который отображается в левом нижнем углу группы уведомлений, к которому относится уведомление уведомление.SummaryArgument specifies how a notification will impact the summary text that appears on the lower-left corner of a notification group to which the notification belongs. iOS объединяет текст сводки из уведомлений в той же группе для создания в целом сводное описание.iOS aggregates summary text from notifications in the same group to create an overall summary description.

Пример приложения использует автора сообщения в качестве аргумента сводки.The sample app uses the message's author as the summary argument. При таком подходе текст сводки для группы шесть уведомлений с помощью Алиса может быть 5 Дополнительные уведомления от Алисы и мне.Using this approach, the summary text for a group of six notifications with Alice might be 5 more notifications from Alice and Me.

Несвязанным уведомленияUnthreaded notifications

Каждое нажатие примера приложения напоминания о встрече кнопка отправляет один из различных уведомления памятки встречи.Each tap of the sample app's Appointment reminder button sends one of various appointment reminder notifications. Так как эти напоминания не являются структурированными, они отображаются в группе уведомления на уровне приложения на экране блокировки и в центре уведомлений.Since these reminders are not threaded, they appear in the application-level notification group on the lock screen and in Notification Center.

Отправка несвязанным уведомления, пример приложения ScheduleUnthreadedNotification метод использует аналогичный код, как описано выше.To send an unthreaded notification, the sample app's ScheduleUnthreadedNotification method uses similar code as above. Тем не менее, она не присваивает ThreadIdentifier на UNMutableNotificationContent объекта.However, it does not set the ThreadIdentifier on the UNMutableNotificationContent object.