iOS 12: группировка уведомлений

    Эта статья, как и предыдущая, посвящена изменениям в Notifications, которые появились в iOS 12.



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


    Группировка в iOS 12


    Для того, чтобы приходящие от вашего приложения нотификации группировались в iOS 12, не нужно ничего предпринимать, группировка будет выполняться автоматически. Нотификации на экране начнут собираться в стек, когда их количество достигнет 5.



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



    • Automatic (по умолчанию) — приложение управляет настройками группировки.
    • By App — настройки приложения игнорируются, все уведомления от приложения складываются в единый стек.
    • Off — настройки приложения игнорируются, группировка уведомлений отключается.

    Настройка группировки


    На группировку сообщений мы можем влиять только в случае использования флага Automatic в настройках. Для этого в нотификации необходимо указать параметр thread-id. Также передадим thread-id в subtitle уведомления для наглядности:


    let content = UNMutableNotificationContent()
    
    content.threadIdentifier = threadId
    content.subtitle = "Thread ID: \(threadId)"

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



    Также можно передать thread-id в пуш нотификации:


    {
        "aps" : {
            "alert" : {
                "title" : "Cat Title"
                "body" : "Cat Body"
            }
            "thread-id" : "all-cats"
        }
    }

    Когда вы указываете идентификатор у нотификации, не забывайте указывать его в UNNotificationCategory, иначе в Extension'е для уведомлений они обрабатываться не будут:


    UNNotificationCategory(identifier: "Cat-Category",
                           actions: actions,
                           intentIdentifiers: ["all-cats", "3-star-cats"],
                           options: [])

    Для категории можно указать формат сообщения, которое будет отображаться у пользователя на устройстве, это ещё одно из нововведений iOS 12. Сделать это можно только при инициализации категории:


    UNNotificationCategory(identifier: "category-simple",
                           actions: actions,
                           intentIdentifiers: ["all-cats", "3-star-cats"],
                           hiddenPreviewsBodyPlaceholder: nil,
                           categorySummaryFormat: "%u новых котиков в разделе %@",
                           options: [])

    Параметр %u отвечает за количество сообщений в группе, его можно модифицировать с помощью аргумента summaryArgumentCount. Например, вы опубликовали новую подборку котиков, в которой 10 новых картинок. Нет смысла присылать пользователю 10 пушей, можно отправить одно сообщение с каунтером, равным 10. Параметр %@ отобразит на экране значение переменной summaryArgument:


    let content = UNMutableNotificationContent()
    content.summaryArgumentCount = 10
    content.summaryArgument = "Все Коты"


    В каждой группе у нас по 3 сообщения, но благодаря тому, что указан параметр summaryArgumentCount, количество сообщений отображается, равным 20. А summaryArgument позволяет нам добавить название категории, к которой относятся пуш-уведомления. Неплохо, но теперь у нас проблема с локлизацией.


    Локализация


    Для реализации задачи по локализации добавим в проект Stringdict File.



    Меняем ключ Localized String Key на NOTIFICATION_SUMMARY, иначе значения из словаря не будут обрабатываться, несмотря на то, что при получении локализованной строки в качестве параметра передаётся ключ с названием словаря. Остальные значения показаны на рисунке:



    В File Inspector для словаря выбираем Localize.



    Указываем файлы для локализации.



    Заходим в настройки проекта и добавляем язык для локализации Russian (ru).



    Лишние файлы можно удалить из проекта.



    В коде получаем локализованную строку и передаем её в качестве параметра categorySummaryFormat:


    let summary = NSString.localizedUserNotificationString(forKey: "NOTIFICATION_SUMMARY",
                                                                         arguments: nil)
    
    let category = UNNotificationCategory(identifier: "Cat-Category",
                                          actions: actions,
                                          intentIdentifiers: ["all-cats", "3-star-cats"],
                                          hiddenPreviewsBodyPlaceholder: nil,
                                          categorySummaryFormat: summary,
                                          options: [])

    В результате получаем отличную локализацию приложения.



    Проект, созданный для прошлой статьи был обновлён, с кодом можно ознакомиться на github. Два доклада на WWDC были посвящены реализации нотификаций: What’s New in User Notifications и Using Grouped Notifications. Обсудить нововведения сможем на MBLT DEV 2018 в Москве 28 сентября.


    Всем хорошей недели! ^_^

    e-Legion

    83,00

    Лидер мобильной разработки в России

    Поделиться публикацией

    Похожие публикации

    Комментарии 0

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

    Самое читаемое