Расширенные уведомления пользователей в Xamarin.iOS

Платформа уведомлений пользователей в iOS 10 позволяет выполнять доставку и обработку локальных и удаленных уведомлений. С помощью этой платформы приложение или расширение приложения может запланировать доставку локальных уведомлений, указав набор условий, таких как расположение или время дня.

Сведения о уведомлениях пользователей

Как указано выше, новая платформа уведомлений пользователей позволяет выполнять доставку и обработку локальных и удаленных уведомлений. С помощью этой платформы приложение или расширение приложения может запланировать доставку локальных уведомлений, указав набор условий, таких как расположение или время дня.

Кроме того, приложение или расширение может получать (и потенциально изменять) локальные и удаленные уведомления по мере их доставки на устройство iOS пользователя.

Новая платформа пользовательского интерфейса уведомлений пользователя позволяет приложению или расширению приложения настраивать внешний вид локальных и удаленных уведомлений при их представлении пользователю.

Эта платформа предоставляет следующие способы, которым приложение может доставлять уведомления пользователю:

  • Визуальные оповещения— где уведомления откатываются в верхней части экрана в виде баннера.
  • Звук и вибрации — может быть связан с уведомлением.
  • Значок приложения Badging — где отображается значок приложения, показывающий, что новое содержимое доступно, например количество непрочитанных сообщений электронной почты.

Кроме того, в зависимости от текущего контекста пользователя существуют различные способы представления уведомления:

  • Если устройство разблокировано, уведомление будет свернуто в верхней части экрана в виде баннера.
  • Если устройство заблокировано, на экране блокировки пользователя отобразится уведомление.
  • Если пользователь пропустил уведомление, он может открыть Центр уведомлений и просмотреть все доступные уведомления.

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

  • Локальные уведомления— они отправляются приложениями, установленными локально на устройстве пользователей.
  • Удаленные уведомления— отправляются с удаленного сервера и отображаются пользователю или активируют фоновое обновление содержимого приложения.

Сведения о локальных уведомлениях

Локальные уведомления о том, что приложение iOS может отправлять следующие функции и атрибуты:

  • Они отправляются приложениями, которые являются локальными на устройстве пользователя.
  • Их можно настроить для использования триггеров на основе времени или расположения.
  • Приложение планирует уведомление с устройством пользователя и отображается при выполнении условия триггера.
  • Когда пользователь взаимодействует с уведомлением, приложение получит обратный вызов.

Ниже приведены некоторые примеры локальных уведомлений:

  • Оповещения календаря
  • Оповещения о напоминаниях
  • Триггеры с учетом расположения

Дополнительные сведения см. в документации по программированию локальных и удаленных уведомлений Apple.

Сведения о удаленных уведомлениях

Удаленные уведомления, которые может отправлять приложение iOS, имеют следующие функции и атрибуты:

  • Приложение имеет серверный компонент, с которым он взаимодействует.
  • Служба push-уведомлений Apple (APNs) используется для передачи наилучших усилий по доставке удаленных уведомлений на устройство пользователя с облачных серверов разработчика.
  • Когда приложение получает удаленное уведомление, оно будет отображаться пользователю.
  • Когда пользователь взаимодействует с уведомлением, приложение получит обратный вызов.

Ниже приведены некоторые примеры удаленных уведомлений:

  • Оповещения новостей
  • Спортивные Обновления
  • Сообщения для обмена мгновенными сообщениями

Существует два типа удаленных уведомлений, доступных приложению iOS:

  • Взаимодействие с пользователем. Они отображаются пользователю на устройстве.
  • Автоматическое Обновления. Они предоставляют механизм обновления содержимого приложения iOS в фоновом режиме. При получении автоматического обновления приложение может обратиться к удаленным серверам, чтобы извлечь последнее содержимое.

Дополнительные сведения см. в документации по программированию локальных и удаленных уведомлений Apple.

Сведения о существующем API уведомлений

До iOS 10 приложение iOS будет использовать UIApplication для регистрации уведомления в системе и планирования активации этого уведомления (по времени или по расположению).

Существует несколько проблем, с которыми разработчик может столкнуться при работе с существующим API уведомлений:

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

О новой платформе уведомлений пользователей

С iOS 10 Apple представила новую платформу уведомлений пользователей, которая заменяет существующий UIApplication метод, указанный выше.

Платформа уведомлений пользователей предоставляет следующие возможности:

  • Знакомый API, который включает четность функций с предыдущими методами, что упрощает перенос кода из существующей платформы.
  • Включает расширенный набор параметров содержимого, который позволяет отправлять более подробные уведомления пользователю.
  • Локальные и удаленные уведомления могут обрабатываться одинаковым кодом и обратными вызовами.
  • Упрощает процесс обработки обратных вызовов, отправляемых в приложение при взаимодействии пользователя с уведомлением.
  • Расширенное управление ожидающих и доставленных уведомлений, включая возможность удаления или обновления уведомлений.
  • Добавляет возможность выполнять презентацию уведомлений в приложении.
  • Добавляет возможность планировать и обрабатывать уведомления из расширений приложений.
  • Добавляет новую точку расширения для самих уведомлений.

Новая платформа уведомлений пользователей предоставляет единый API уведомлений на нескольких платформах, поддерживаемых Apple, в том числе:

  • iOS — полная поддержка для управления уведомлениями и планирования.
  • tvOS — добавляет возможность значков приложений для локальных и удаленных уведомлений.
  • watchOS — добавляет возможность переадресации уведомлений с парного устройства iOS пользователя в Apple Watch и предоставляет приложениям возможность выполнять локальные уведомления непосредственно на самом устройстве.
  • macOS — полная поддержка для управления и планирования уведомлений.

Дополнительные сведения см. в документации apple UserNotifications Framework Reference and UserNotificationsUI .

Подготовка к доставке уведомлений

Прежде чем приложение iOS может отправлять уведомления пользователю, приложение должно быть зарегистрировано в системе и, поскольку уведомление является прерыванием для пользователя, приложение должно явно запрашивать разрешение перед отправкой.

Существует три различных уровня запросов на уведомления, которые пользователь может утвердить для приложения:

  • Отображается баннер.
  • Звуковые оповещения.
  • Ошибка значка приложения.

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

Разрешение на уведомление следует запрашивать сразу после запуска приложения, добавив следующий код в FinishedLaunching метод метода AppDelegate и установив нужный тип уведомления (UNAuthorizationOptions):

Примечание.

UNUserNotificationCenter доступен только из iOS 10+. Поэтому перед отправкой запроса рекомендуется проверка версию macOS.

using UserNotifications;
...

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
    // Version check
    if (UIDevice.CurrentDevice.CheckSystemVersion (10, 0)) {
        // Request notification permissions from the user
        UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert, (approved, err) => {
            // Handle approval
        });
    }

    return true;
}

Так как этот API унифицирован, а также работает на Mac 10.14+, если вы нацелены на macOS, вы также должны проверка для разрешения уведомления как можно скорее:

using UserNotifications;
...

public override void DidFinishLaunching (NSNotification notification)
{
    // Check we're at least v10.14
    if (NSProcessInfo.ProcessInfo.IsOperatingSystemAtLeastVersion (new NSOperatingSystemVersion (10, 14, 0))) {
        // Request notification permissions from the user
        UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound, (approved, err) => {
            // Handle approval
        });
    }
}

> [!NOTE]
> With MacOS apps, for the permission dialog to appear, you must sign your macOS app, even if building locally in DEBUG mode. Therefore, **Project->Options->Mac Signing->Sign the application bundle** must be checked.

Additionally, a user can always change the notification privileges for an app at any time using the **Settings** app on the device. The app should check for the user's requested notification privileges before presenting a notification using the following code:

```csharp
// Get current notification settings
UNUserNotificationCenter.Current.GetNotificationSettings ((settings) => {
    var alertsAllowed = (settings.AlertSetting == UNNotificationSetting.Enabled);
});    

Настройка среды удаленных уведомлений

В iOS 10 разработчик должен сообщить ОС, в какой среде выполняется push-уведомление в качестве разработки или рабочей среды. Не удается предоставить эти сведения, это может привести к отклонению приложения при отправке в iTune App Store с уведомлением, аналогичным следующему:

Отсутствует право push-уведомлений . Ваше приложение включает API для службы push-уведомлений Apple, но aps-environment право отсутствует в подписи приложения.

Чтобы предоставить необходимое право, сделайте следующее:

  1. Дважды щелкните Entitlements.plist файл на панели решения, чтобы открыть его для редактирования.

  2. Перейдите в представление исходного кода.

    The Source view

  3. Нажмите кнопку + , чтобы добавить новый ключ.

  4. Введите aps-environment для свойства, оставьте тип как String и введите development или production для значения:

    The aps-environment Property

  5. Сохраните изменения в файле.

Регистрация для удаленных уведомлений

Если приложение будет отправлять и получать удаленные уведомления, он по-прежнему должен выполнять регистрацию маркеров с помощью существующего UIApplication API. Для этой регистрации требуется, чтобы устройство имели api доступа к динамическому сетевому подключению, который создаст необходимый маркер, который будет отправлен приложению. Затем приложение должно перенаправить этот маркер на серверное приложение разработчика, чтобы зарегистрировать для удаленных уведомлений:

Token Registration overview

Используйте следующий код для инициализации требуемой регистрации:

UIApplication.SharedApplication.RegisterForRemoteNotifications ();

Маркер, который отправляется на серверное приложение разработчика, необходимо включить в состав полезных данных уведомлений, отправляемых с сервера на APNs при отправке удаленного уведомления:

The token included as part of the Notification Payload

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

Дополнительные сведения см. в документации по программированию локальных и удаленных уведомлений Apple.

Доставка уведомлений

После полной регистрации приложения и необходимых разрешений, запрошенных пользователем и предоставленных пользователем, приложение теперь готово для отправки и получения уведомлений.

Предоставление содержимого уведомления

Новые для iOS 10, все уведомления содержат как заголовок, так и подзаголовок, которые всегда будут отображаться с текстом содержимого уведомления. Кроме того, новая возможность добавления вложений мультимедиа в содержимое уведомления.

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

var content = new UNMutableNotificationContent();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;

Для удаленных уведомлений процесс аналогичен:

{
    "aps":{
        "alert":{
            "title":"Notification Title",
            "subtitle":"Notification Subtitle",
            "body":"This is the message body of the notification."
        },
        "badge":1
    }
}

Планирование отправки уведомления

При создании уведомления приложение должно запланировать, когда уведомление будет представлено пользователю, задав триггер. IOS 10 предоставляет четыре различных типа триггеров:

  • Push-уведомление — используется исключительно с удаленными уведомлениями и активируется при отправке ПАКЕТА уведомлений в приложение, работающее на устройстве.
  • Интервал времени— позволяет планировать локальное уведомление с интервала времени, начинающегося с этого момента и заканчивая некоторой будущей точкой. Например: var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger (5, false);
  • Дата календаря— позволяет запланировать локальные уведомления для определенной даты и времени.
  • Расположение на основе . Позволяет планировать локальные уведомления, когда устройство iOS вводит или покидает определенное географическое расположение или находится в заданной близости к любым Bluetooth-маякам.

Когда будет готово локальное уведомление, приложение должно вызвать Add метод UNUserNotificationCenter объекта, чтобы запланировать его отображение пользователю. Для удаленных уведомлений приложение на стороне сервера отправляет полезные данные уведомлений в APNs, которые затем отправляют пакет на устройство пользователя.

Объединение всех частей может выглядеть следующим образом:

using UserNotifications;
...

var content = new UNMutableNotificationContent ();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;

var trigger =  UNTimeIntervalNotificationTrigger.CreateTrigger (5, false);

var requestID = "sampleRequest";
var request = UNNotificationRequest.FromIdentifier (requestID, content, trigger);

UNUserNotificationCenter.Current.AddNotificationRequest (request, (err) => {
    if (err != null) {
        // Do something with error...
    }
});

Обработка уведомлений о приложении переднего плана

Новое в iOS 10, приложение может обрабатывать уведомления по-разному, когда оно находится на переднем плане и запускается уведомление. UNUserNotificationCenterDelegate Предоставив метод и реализуя WillPresentNotification этот метод, приложение может взять на себя ответственность за отображение уведомления. Например:

using System;
using UserNotifications;

namespace MonkeyNotification
{
    public class UserNotificationCenterDelegate : UNUserNotificationCenterDelegate
    {
        #region Constructors
        public UserNotificationCenterDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override void WillPresentNotification (UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
        {
            // Do something with the notification
            Console.WriteLine ("Active Notification: {0}", notification);

            // Tell system to display the notification anyway or use
            // `None` to say we have handled the display locally.
            completionHandler (UNNotificationPresentationOptions.Alert);
        }
        #endregion
    }
}

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

Если приложение хотело отобразить уведомление, когда оно было на переднем плане, а не использовать системные значения по умолчанию, передайте None в обработчик завершения. Пример:

completionHandler (UNNotificationPresentationOptions.None);

В этом коде откройте AppDelegate.cs файл для редактирования и измените FinishedLaunching метод следующим образом:

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
    // Request notification permissions from the user
    UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert, (approved, err) => {
        // Handle approval
    });

    // Watch for notifications while the app is active
    UNUserNotificationCenter.Current.Delegate = new UserNotificationCenterDelegate ();

    return true;
}

Этот код присоединяет пользовательский код UNUserNotificationCenterDelegate выше к текущему UNUserNotificationCenter , чтобы приложение может обрабатывать уведомления во время активности и на переднем плане.

Управление уведомлениями

Новое в iOS 10, управление уведомлениями предоставляет доступ как к ожидающих, так и доставленным уведомлениям и добавляет возможность удалять, обновлять или продвигать эти уведомления.

Важной частью управления уведомлениями является идентификатор запроса, назначенный уведомлению при его создании и планировании в системе. Для удаленных уведомлений это назначается с помощью нового apps-collapse-id поля в заголовке HTTP-запроса.

Идентификатор запроса используется для выбора уведомления о том, что приложение хочет выполнить управление уведомлениями.

Удаление уведомлений

Чтобы удалить ожидающие уведомления из системы, используйте следующий код:

var requests = new string [] { "sampleRequest" };
UNUserNotificationCenter.Current.RemovePendingNotificationRequests (requests);

Чтобы удалить уже доставленное уведомление, используйте следующий код:

var requests = new string [] { "sampleRequest" };
UNUserNotificationCenter.Current.RemoveDeliveredNotifications (requests);

Обновление существующего уведомления

Чтобы обновить существующее уведомление, просто создайте уведомление с нужными параметрами, измененными (например, новым временем триггера) и добавьте его в систему с тем же идентификатором запроса, что и уведомление, которое необходимо изменить. Пример:

using UserNotifications;
...

// Rebuild notification
var content = new UNMutableNotificationContent ();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;

// New trigger time
var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger (10, false);

// ID of Notification to be updated
var requestID = "sampleRequest";
var request = UNNotificationRequest.FromIdentifier (requestID, content, trigger);

// Add to system to modify existing Notification
UNUserNotificationCenter.Current.AddNotificationRequest (request, (err) => {
    if (err != null) {
        // Do something with error...
    }
});

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

Работа с действиями уведомлений

В iOS 10 уведомления, которые доставляются пользователю, не являются статическими и предоставляют несколько способов взаимодействия с ними (от встроенных до пользовательских действий).

Существует три типа действий, на которые может отвечать приложение iOS:

  • Действие по умолчанию — это когда пользователь нажимает уведомление, чтобы открыть приложение и отобразить сведения о данном уведомлении.
  • Пользовательские действия . Они были добавлены в iOS 8 и предоставляют быстрый способ выполнения пользовательской задачи непосредственно из уведомления без необходимости запуска приложения. Они могут быть представлены в виде списка кнопок с настраиваемыми заголовками или текстовым полем ввода, которое может выполняться в фоновом режиме (где приложению предоставляется небольшое время для выполнения запроса) или переднего плана (где приложение запускается на переднем плане для выполнения запроса). Пользовательские действия доступны как в iOS, так и в watchOS.
  • Действие "Закрыть" — это действие отправляется приложению, когда пользователь закрывает данное уведомление.

Создание пользовательских действий

Чтобы создать и зарегистрировать пользовательское действие в системе, используйте следующий код:

// Create action
var actionID = "reply";
var title = "Reply";
var action = UNNotificationAction.FromIdentifier (actionID, title, UNNotificationActionOptions.None);

// Create category
var categoryID = "message";
var actions = new UNNotificationAction [] { action };
var intentIDs = new string [] { };
var categoryOptions = new UNNotificationCategoryOptions [] { };
var category = UNNotificationCategory.FromIdentifier (categoryID, actions, intentIDs, UNNotificationCategoryOptions.None);
    
// Register category
var categories = new UNNotificationCategory [] { category };
UNUserNotificationCenter.Current.SetNotificationCategories (new NSSet<UNNotificationCategory>(categories)); 

При создании нового UNNotificationActionидентификатор назначается уникальный идентификатор и заголовок, который будет отображаться на кнопке. По умолчанию действие будет создано в качестве фонового действия, однако параметры можно предоставить для настройки поведения действия действия (например, для настройки действия переднего плана).

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

Наконец, все категории регистрируются в системе с помощью SetNotificationCategories метода.

Представление пользовательских действий

После создания и регистрации в системе набора пользовательских действий и категорий их можно представить из локальных или удаленных уведомлений.

Для удаленного уведомления задайте полезные category данные удаленного уведомления, соответствующие одной из категорий, созданных выше. Например:

{
    aps:{
        alert:"Hello world!",
        category:"message"
    }
}

Для локальных уведомлений задайте CategoryIdentifier свойство UNMutableNotificationContent объекта. Например:

var content = new UNMutableNotificationContent ();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;
content.CategoryIdentifier = "message";
...

Опять же, этот идентификатор должен соответствовать одной из категорий, созданных выше.

Обработка действий увольнения

Как указано выше, действие "Закрыть" можно отправить приложению, когда пользователь закрывает уведомление. Так как это не стандартное действие, при создании категории необходимо задать параметр. Например:

var categoryID = "message";
var actions = new UNNotificationAction [] { action };
var intentIDs = new string [] { };
var categoryOptions = new UNNotificationCategoryOptions [] { };
var category = UNNotificationCategory.FromIdentifier (categoryID, actions, intentIDs, UNNotificationCategoryOptions.CustomDismissAction);

Обработка ответов на действия

Когда пользователь взаимодействует с пользовательскими действиями и категориями, созданными выше, приложение должно выполнить запрошенную задачу. Это делается путем предоставления UNUserNotificationCenterDelegate и реализации UserNotificationCenter метода. Например:

using System;
using UserNotifications;

namespace MonkeyNotification
{
    public class UserNotificationCenterDelegate : UNUserNotificationCenterDelegate
    {
        ...

        #region Override Methods
        public override void DidReceiveNotificationResponse (UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
        {
            // Take action based on Action ID
            switch (response.ActionIdentifier) {
            case "reply":
                // Do something
                break;
            default:
                // Take action based on identifier
                if (response.IsDefaultAction) {
                    // Handle default action...
                } else if (response.IsDismissAction) {
                    // Handle dismiss action
                }
                break;
            }

            // Inform caller it has been handled
            completionHandler();
        }
        #endregion
    }
}

Переданный ActionIdentifier в UNNotificationResponse классе имеет свойство, которое может быть действием по умолчанию или действием "Закрыть". Используется response.Notification.Request.Identifier для проверки любых пользовательских действий.

Свойство UserText содержит значение любого пользовательского текстового ввода. Свойство Notification содержит исходное уведомление, включающее запрос с содержимым триггера и уведомления. Приложение может решить, было ли оно локальным или удаленным уведомлением на основе типа триггера.

Примечание.

IOS 12 позволяет пользовательскому пользовательскому интерфейсу уведомлений изменять кнопки действий во время выполнения. Дополнительные сведения см. в документации по кнопкам динамического уведомления.

Работа с расширениями службы

При работе с удаленными уведомлениями расширения служб предоставляют возможность сквозного шифрования внутри полезных данных уведомлений. Расширения служб — это расширение, отличное от пользовательского интерфейса (доступное в iOS 10), которое выполняется в фоновом режиме с основной целью расширения или замены видимого содержимого уведомления перед его представлением пользователю.

Service Extension overview

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

Ниже приведены некоторые потенциальные возможности использования расширений служб.

  • Предоставление сквозного шифрования содержимого удаленного уведомления.
  • Добавление вложений в удаленные уведомления для их обогащения.

Реализация расширения службы

Чтобы реализовать расширение службы в приложении Xamarin.iOS, сделайте следующее:

  1. Откройте решение приложения в Visual Studio для Mac.

  2. Щелкните правой кнопкой мыши имя решения на панели решения и выберите "Добавить>новый проект".

  3. Выберите расширения службы уведомлений для расширений> iOS>и нажмите кнопку "Далее":

    Select Notification Service Extensions

  4. Введите имя расширения и нажмите кнопку "Далее":

    Enter a Name for the extension

  5. При необходимости измените имя проекта и (или) имя решения и нажмите кнопку "Создать ".

    Adjust the Project Name and/or Solution Name

Внимание

Идентификатор пакета для расширения службы должен соответствовать идентификатору пакета основного приложения с .appnameserviceextension добавлением к концу. Например, если основное приложение имеет идентификатор com.xamarin.monkeynotifyпакета, расширение службы должно иметь идентификатор com.xamarin.monkeynotify.monkeynotifyserviceextensionпакета. При добавлении расширения в решение оно должно быть задано автоматически.

Существует один основной класс в расширении службы уведомлений, который необходимо изменить для предоставления необходимых функциональных возможностей. Например:

using System;
using Foundation;
using UIKit;
using UserNotifications;

namespace MonkeyChatServiceExtension
{
    [Register ("NotificationService")]
    public class NotificationService : UNNotificationServiceExtension
    {
        #region Computed Properties
        public Action<UNNotificationContent> ContentHandler { get; set; }
        public UNMutableNotificationContent BestAttemptContent { get; set; }
        #endregion

        #region Constructors
        protected NotificationService (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override void DidReceiveNotificationRequest (UNNotificationRequest request, Action<UNNotificationContent> contentHandler)
        {
            ContentHandler = contentHandler;
            BestAttemptContent = (UNMutableNotificationContent)request.Content.MutableCopy ();

            // Modify the notification content here...
            BestAttemptContent.Title = $"{BestAttemptContent.Title}[modified]";

            ContentHandler (BestAttemptContent);
        }

        public override void TimeWillExpire ()
        {
            // Called just before the extension will be terminated by the system.
            // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.

            ContentHandler (BestAttemptContent);
        }
        #endregion
    }
}

Первый метод DidReceiveNotificationRequestбудет передан идентификатору уведомления, а также содержимому request уведомления через объект. Передаваемая contentHandler запись должна вызываться для представления уведомления пользователю.

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

Активация расширения службы

С помощью расширения службы, созданного и доставленного с помощью приложения, его можно активировать, изменив полезные данные удаленного уведомления, отправленные на устройство. Например:

{
    aps : {
        alert : "New Message Available",
        mutable-content: 1
    },
    encrypted-content : "#theencryptedcontent"
}

Новый mutable-content ключ указывает, что для обновления содержимого удаленного уведомления необходимо запустить расширение службы. Ключ encrypted-content содержит зашифрованные данные, которые расширение службы может расшифровать перед представлением пользователю.

Ознакомьтесь со следующим примером расширения службы:

using UserNotification;

namespace myApp {
    public class NotificationService : UNNotificationServiceExtension {
    
        public override void DidReceiveNotificationRequest(UNNotificationRequest request, contentHandler) {
            // Decrypt payload
            var decryptedBody = Decrypt(Request.Content.UserInfo["encrypted-content"]);
            
            // Modify Notification body
            var newContent = new UNMutableNotificationContent();
            newContent.Body = decryptedBody;
            
            // Present to user
            contentHandler(newContent);
        }
        
        public override void TimeWillExpire() {
            // Handle out-of-time fallback event
            ...
        }
        
    }
}

Этот код расшифровывает зашифрованное содержимое из encrypted-content ключа, создает новое UNMutableNotificationContent, устанавливает Body свойство в расшифрованное содержимое и использует contentHandler для представления уведомления пользователю.

Итоги

В этой статье рассматриваются все способы улучшения уведомлений пользователей с помощью iOS 10. Он представил новую платформу уведомлений пользователей и как использовать ее в приложении Xamarin.iOS или расширении приложения.