Интерактивные пользовательские интерфейсы уведомлений в Xamarin.iOS

Расширения содержимого уведомлений, представленные в iOS 10, позволяют создавать пользовательские пользовательские интерфейсы для уведомлений. Начиная с iOS 12, пользовательские интерфейсы уведомлений могут содержать интерактивные элементы, такие как кнопки и ползунки.

Файл расширения содержимого уведомления Info.plist

В примере приложения файл Info.plist в проекте RedGreenNotificationsContentExtension содержит следующую конфигурацию:

<!-- ... -->
<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>UNNotificationExtensionCategory</key>
        <array>
            <string>red-category</string>
            <string>green-category</string>
        </array>
        <key>UNNotificationExtensionUserInteractionEnabled</key>
        <true/>
        <key>UNNotificationExtensionDefaultContentHidden</key>
        <true/>
        <key>UNNotificationExtensionInitialContentSizeRatio</key>
        <real>0.6</real>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.usernotifications.content-extension</string>
    <key></key>
    <true/>
</dict>
<!-- ... -->

Обратите внимание на следующие функции:

  • Массив UNNotificationExtensionCategory задает тип категорий уведомлений, которые обрабатывает расширение содержимого.
  • Чтобы поддерживать интерактивное содержимое, расширение содержимого UNNotificationExtensionUserInteractionEnabled уведомления задает для ключа значение true.
  • Ключ UNNotificationExtensionInitialContentSizeRatio задает начальное соотношение высоты и ширины интерфейса расширения содержимого.

Интерактивный интерфейс

MainInterface.storyboard, который определяет интерфейс для расширения содержимого уведомления, является стандартной раскадровки, содержащей один контроллер представления. В примере приложения контроллер представления имеет тип NotificationViewControllerи содержит представление изображения, три кнопки и ползунок. Раскадровка связывает эти элементы управления с обработчиками, определенными в NotificationViewController.cs:

  • Обработчик кнопки "Запустить приложение" вызывает PerformNotificationDefaultAction метод действия, ExtensionContextв котором запускается приложение:

    partial void HandleLaunchAppButtonTap(UIButton sender)
    {
        ExtensionContext.PerformNotificationDefaultAction();
    }
    

    В приложении центр Delegate уведомлений пользователя (в примере приложения AppDelegate) может реагировать на взаимодействие в методе DidReceiveNotificationResponse :

    [Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
    public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, System.Action completionHandler)
    {
        if (response.IsDefaultAction)
        {
            Console.WriteLine("ACTION: Default");
            // ...
    
  • Обработчик кнопки "Закрыть уведомление " вызывается DismissNotificationContentExtension , ExtensionContextв котором закрывается уведомление:

    partial void HandleDismissNotificationButtonTap(UIButton sender)
    {
        ExtensionContext.DismissNotificationContentExtension();
    }
    
  • Обработчик кнопки "Удалить уведомление " закрывает уведомление и удаляет его из Центра уведомлений:

    partial void HandleRemoveNotificationButtonTap(UIButton sender)
    {
        ExtensionContext.DismissNotificationContentExtension();
        UNUserNotificationCenter.Current.RemoveDeliveredNotifications(new string[] { notification.Request.Identifier });
    }
    
  • Метод, который обрабатывает изменения значений на ползунке, обновляет альфа-файл изображения, отображаемого в интерфейсе уведомления:

    partial void HandleSliderValueChanged(UISlider sender)
    {
        Xamagon.Alpha = sender.Value;
    }