Advertisement
  1. Code
  2. iOS 10

IOS 10: Расширения службы уведомлений

by
Read Time:5 minsLanguages:

Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)

Вступление

При получение уведомлений в iOS, вы, возможно захотите иметь возможность скачать содержимое в ответ на него или отредактировать содержимое перед показом его конечному пользователю. В iOS 10, Apple добавила приложениям такую возможность, через новый Notification Service Extension.

Это может вам понадобиться, например, если у вас приложение по обмену сообщениями, в котором back-end сервер идентифицирует пользователей по чему-то типа кода, а не по имени. Для пользователя вашего приложения имена и другие данные их контактов могут храниться локально на устройстве. При отправке уведомления пользователю, когда он получает сообщение, исходная полезная нагрузка может включать идентификатор отправителя, который может быть заменен вашей службой на имя контакта.

Чтобы использовать этот новый тип расширения, вам нужно будет разрабатывать приложение с помощью Xcode 8 или более поздней версии и SDK iOS 10.

Обратите внимание на следующее, прежде чем продолжить:

  • В этой статье не будет рассмотрен процесс настройки вашего приложения для отправки/получения локальных или push-уведомлений.
  • В приведенном примере кода будет использоваться API, представленное в фреймворке UserNotifications, что также является новинкой в iOS 10.
  • Если вы хотите узнать, как создавать пользовательские интерфейсы для своих уведомлений, это делается с помощью расширений содержимого уведомлений.

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

1. Установка расширения

Процесс добавления расширения службы уведомлений в приложение iOS идентичен процессу для других расширений. В меню Xcode, идём в File > New > Target... и из отобразившегося списка выбираем шаблон Notification Service Extension:

Extension TemplateExtension TemplateExtension Template

В следующем меню вы можете заполнить информацию о приложении.

После того как ваше расширение будет создано, вы увидите два файла (или три, если вы используете Objective-C) в папке расширения через Project navigator в Xcode:

  • NotificationService.swift, который будет содержать весь код и логику для вашего расширения.
  • Info.plist, который содержит сведения о конфигурации для вашего расширения.

Файл Info.plist содержит всю информацию, необходимую для вашего расширения, поэтому единственным файлом, который необходимо изменить, является файл NotificationService.swift.

2. Жизненный цикл расширения

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

  1. Приложение получает уведомление.
  2. Система создает экземпляр вашего класса расширения и запускает его в фоновом режиме.
  3. Ваше расширение изменяет контент и/или загружает некоторый контент.
  4. Если вашему расширению требуется слишком много времени для выполнения, оно будет уведомлено и немедленно завершено.
  5. Уведомление отображается пользователю.

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

3. Код расширения

Расширение службы уведомлений существует как один объект, который является подклассом класса UNNotificationServiceExtension. Этот класс определяет следующие методы:

  • didReceive(_:withContentHandler:), который предоставляет ваше расширение исходному объекту UNNotificationRequest. В этом методе вы создаете новый объект UNNotificationContent и передаете его в качестве параметра обработчику завершения, когда закончите. Содержимое этого уведомления может быть создано с нуля или из измененной копии исходного содержимого. Следующий код показывает пример реализации этого метода:
  • serviceExtensionTimeWillExpire, который выполняется, когда ваше расширение должно завершиться системой. Этот метод не содержит никаких параметров, поэтому, если вы хотите, чтобы ваше расширение предоставляло версию вашего измененного контента в процессе, вам нужно будет сохранить ссылку на обработчик завершения из метода didReceive(_:withContentHandler:). Следующий код показывает, как это может быть достигнуто в подклассе вашего расширения:

4. Ограничения расширения

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

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

Во-вторых, словарь входящих уведомлений aps в своей полезной нагрузке должен включать ключ изменяемого содержимого mutable-content со значением 1.

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

Заключение

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

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.