Сгруппированные уведомления в 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;
}
( 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
.