Сгруппированные уведомления в Xamarin.iOS

По умолчанию iOS 12 помещает все уведомления приложения в группу. Экран блокировки и Центр уведомлений отображают эту группу в виде стека с последними уведомлениями сверху. Пользователи могут развернуть группу, чтобы просмотреть все уведомления, содержащиеся в ней, и закрыть группу в целом.

Приложения также могут группировать уведомления по потокам, что упрощает поиск и взаимодействие пользователей с определенной информацией, которую они интересуют.

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

Чтобы узнать, как использовать сгруппированные уведомления с Xamarin.iOS, ознакомьтесь с примером приложения GroupedNotifications .

Это пример приложения имитирует беседы с различными друзьями, отправляя уведомление для каждого сообщения и группируя их по потоку. В нем также показано, как непрочитанные уведомления помещются в группу уровня приложения.

Фрагменты кода в этом руководстве поступают из этого примера приложения.

Запрос авторизации и разрешение уведомлений переднего плана

Прежде чем приложение сможет отправлять локальные уведомления, он должен запросить разрешение на это. В примере приложения AppDelegateFinishedLaunching метод запрашивает это разрешение:

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в:

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

Параметр UNNotificationPresentationOptions.Alert указывает, что приложение должно отображать оповещение, но не воспроизводить звук или обновлять значок.

Потоковые уведомления

Нажмите кнопку "Сообщение примера приложения " с кнопкой "Алиса ", чтобы отправить уведомления для беседы с другом с именем Алиса. Так как уведомления этой беседы являются частью одного потока, экран блокировки и центр уведомлений группируют их вместе.

Чтобы начать беседу с другим другом, нажмите кнопку "Выбрать нового друга ". Уведомления об этой беседе отображаются в отдельной группе.

ThreadIdentifier

Каждый раз, когда пример приложения запускает новый поток, он создает уникальный идентификатор потока:

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

Чтобы отправить потоковые уведомления, пример приложения:

  • Проверяет, имеет ли приложение авторизацию для отправки уведомления.
  • Создает UNMutableNotificationContent объект для содержимого уведомления и задает его ThreadIdentifier идентификатор потока, созданный выше.
  • Создает запрос и планирует уведомление:
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.

СводкаArgument

SummaryArgument Указывает, как уведомление будет влиять на текст сводки, отображаемый в левом нижнем углу группы уведомлений, к которой относится уведомление. IOS объединяет текст сводки из уведомлений в той же группе, чтобы создать общее описание сводки.

В примере приложения в качестве аргумента сводки используется автор сообщения. С помощью этого подхода сводный текст для группы из шести уведомлений с Алиса может быть еще 5 уведомлений от Алисы и Меня.

Непрочитанные уведомления

Каждое нажатие кнопки напоминания о встрече примера приложения отправляет одно из различных уведомлений о напоминаниях о встрече. Так как эти напоминания не передаются в потоки, они отображаются в группе уведомлений на уровне приложения на экране блокировки и в Центре уведомлений.

Чтобы отправить непрочитанное уведомление, метод примера приложения ScheduleUnthreadedNotification использует аналогичный код, как описано выше. Однако он не задает ThreadIdentifier объект UNMutableNotificationContent .