Статьи

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

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

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

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

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

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

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

  • Всплывающее уведомление
    Настройка Push-уведомлений на iOS
    Барт Джейкобс
  • IOS
    Введение в среду пользовательских уведомлений
  • iOS SDK
    iOS 10: создание пользовательских интерфейсов уведомлений

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

Шаблон расширения

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

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

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

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

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

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

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

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

  • didReceive(_:withContentHandler:) который предоставляет вашему расширению исходный объект UNNotificationRequest . В этом методе вы создаете новый объект UNNotificationContent и передаете его в качестве параметра обработчику завершения, когда закончите. Этот контент уведомлений может быть создан с нуля или из изменяемой копии оригинального контента. Следующий код показывает пример реализации этого метода:
1
2
3
4
5
6
7
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    if let copy = request.content.mutableCopy() as?
        // Edit properties of copy
         
        contentHandler(copy)
    }
}
  • serviceExtensionTimeWillExpire который выполняется, когда ваше расширение собирается завершиться системой. Этот метод не содержит никаких параметров, поэтому, если вы хотите, чтобы ваше расширение предоставляло didReceive(_:withContentHandler:) версию вашего измененного контента, вам нужно будет сохранить ссылку на обработчик завершения из didReceive(_:withContentHandler:) . Следующий код показывает, как этого можно достичь в подклассе расширения:
01
02
03
04
05
06
07
08
09
10
11
// Set this property from the didReceive(_:withContentHandler:) method
var contentHandler: ((UNNotificationContent) -> Void)?
 
// Modify this property as you manipulate the content
var bestAttemptContent: UNMutableNotificationContent?
 
override func serviceExtensionTimeWillExpire() {
    if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
        contentHandler(bestAttemptContent)
    }
}

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

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

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

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

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

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

  • IOS
    Обновите ваше приложение до iOS 10
    Барт Джейкобс
  • iOS SDK
    iOS 10: создание пользовательских интерфейсов уведомлений
  • стриж
    Чего ожидать от Swift 3
    Барт Джейкобс