Уведомления в Xamarin.iOS
Внимание
Сведения в этом разделе относятся к iOS 9 и более предыдущим. Сведения об iOS 10 и более поздних версиях см. в руководстве по платформе уведомлений пользователей.
IOS имеет три способа указать пользователю, что получено уведомление:
- Звук или вибрация — iOS может воспроизводить звук для уведомления пользователей. Если звук отключен, устройство можно настроить для вибрации.
- Оповещения — можно отобразить диалоговое окно на экране с информацией о уведомлении.
- Индикаторы событий. При публикации уведомления на значке приложения можно отобразить номер (значок).
iOS также предоставляет Центр уведомлений, который будет отображать все уведомления, как локальные, так и удаленные, пользователю. Пользователи могут получить доступ к этому, прокрутив вниз в верхней части экрана:
Создание локальных уведомлений в iOS
iOS упрощает создание и обработку локальных уведомлений. Во-первых, iOS 8 требует, чтобы приложения запрашивали разрешение пользователя на отображение уведомлений. Добавьте следующий код в приложение перед попыткой отправить локальное уведомление, как правило, в методе FinishedLaunching AppDelegate:
var notificationSettings = UIUserNotificationSettings.GetSettingsForTypes(
UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, null
);
application.RegisterUserNotificationSettings(notificationSettings);
Чтобы запланировать локальное уведомление, создайте UILocalNotification
объект, задайте FireDate
объект и запланируйте его с помощью ScheduleLocalNotification
метода в объекте UIApplication.SharedApplication
. В следующем фрагменте кода показано, как запланировать уведомление, которое будет запускаться в течение одной минуты в будущем, и отображать оповещение с сообщением:
UILocalNotification notification = new UILocalNotification();
notification.FireDate = NSDate.FromTimeIntervalSinceNow(15);
//notification.AlertTitle = "Alert Title"; // required for Apple Watch notifications
notification.AlertAction = "View Alert";
notification.AlertBody = "Your 15 second alert has fired!";
UIApplication.SharedApplication.ScheduleLocalNotification(notification);
На следующем снимку экрана показано, как выглядит это оповещение:
Обратите внимание, что если пользователь решил не разрешать уведомления, то ничего не будет отображаться.
Если вы хотите применить эмблему к значку приложения с номером, его можно задать, как показано в следующем коде строки:
notification.ApplicationIconBadgeNumber = 1;
Чтобы воспроизвести звук со значком, задайте свойство SoundName в уведомлении, как показано в следующем фрагменте кода:
notification.SoundName = UILocalNotification.DefaultSoundName;
Если звук уведомления превышает 30 секунд, iOS будет воспроизводить звук по умолчанию.
Внимание
В симуляторе iOS возникает ошибка, которая дважды запустит уведомление делегата. Эта проблема не должна возникать при запуске приложения на устройстве.
Обработка уведомлений
Приложения iOS обрабатывают удаленные и локальные уведомления практически так же. При запуске ReceivedLocalNotification
приложения вызывается метод или ReceivedRemoteNotification
метод класса AppDelegate
, а сведения о уведомлении передаются в качестве параметра.
Приложение может обрабатывать уведомление разными способами. Например, приложение может просто отобразить оповещение, чтобы напоминать пользователям о каком-то событии. Кроме того, уведомление может использоваться для отображения оповещения пользователю о завершении процесса, например синхронизации файлов с сервером.
В следующем коде показано, как обработать локальное уведомление и отобразить оповещение и сбросить номер индикатора событий до нуля:
public override void ReceivedLocalNotification(UIApplication application, UILocalNotification notification)
{
// show an alert
UIAlertController okayAlertController = UIAlertController.Create(notification.AlertAction, notification.AlertBody, UIAlertControllerStyle.Alert);
okayAlertController.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
Window.RootViewController.PresentViewController(okayAlertController, true, null);
// reset our badge
UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0;
}
Если приложение не запущено, iOS воспроизводит звук и (или) обновит значок значка в соответствии с применимым. Когда пользователь запускает приложение, связанное с оповещением, приложение запустится и FinishedLaunching
метод делегата приложения будет вызван, а сведения о уведомлении будут переданы через launchOptions
параметр. Если словарь параметров содержит ключ UIApplication.LaunchOptionsLocalNotificationKey
, AppDelegate
то известно, что приложение было запущено из локального уведомления. В следующем фрагменте кода демонстрируется этот процесс:
// check for a local notification
if (launchOptions.ContainsKey(UIApplication.LaunchOptionsLocalNotificationKey))
{
var localNotification = launchOptions[UIApplication.LaunchOptionsLocalNotificationKey] as UILocalNotification;
if (localNotification != null)
{
UIAlertController okayAlertController = UIAlertController.Create(localNotification.AlertAction, localNotification.AlertBody, UIAlertControllerStyle.Alert);
okayAlertController.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
Window.RootViewController.PresentViewController(okayAlertController, true, null);
// reset our badge
UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0;
}
}
Для удаленного уведомления launchOptions
будет связан LaunchOptionsRemoteNotificationKey
с связанной NSDictionary
с ней полезные данные для удаленного уведомления. Полезные данные уведомления можно извлечь с помощью клавиш badge
и sound
ключейalert
. В следующем фрагменте кода показано, как получить удаленные уведомления:
NSDictionary remoteNotification = options[UIApplication.LaunchOptionsRemoteNotificationKey];
if(remoteNotification != null)
{
string alert = remoteNotification["alert"];
}
Итоги
В этом разделе показано, как создать и опубликовать уведомление в Xamarin.iOS. В нем показано, как приложение может реагировать на уведомления, переопределяя ReceivedLocalNotification
метод или ReceivedRemoteNotification
метод в нем AppDelegate
.