iOS 12: novo nas notificações

A conferência da WWDC foi realizada e ainda há muitos relatórios que valem a pena ser vistos. Havia tópicos principais aos quais a Apple prestou atenção especial. ML principal, atalhos Siri e, é claro, alterações em Notificações.



Como nem todo mundo tem tempo livre suficiente para percorrer a selva de documentação, que, como geralmente acontece, deixa muito a desejar na fase de teste beta, preparei uma revisão de novos recursos e substanciei o material com uma implementação prática. Leia, entenda e integre-se aos seus aplicativos.


Vamos começar com uma visão geral dos recursos que a Apple adicionou.


Agrupamento de notificações


Para implementar, você não precisa fazer nada. O iOS 12 agrupará automaticamente as mensagens para você. Mas existem nuances relacionadas à personalização, localização e agrupamento, mas não com base no identificador do aplicativo, mas, por exemplo, dependendo do nome do usuário que enviou a notificação.


Além disso, se você for testar o agrupamento de notificações, preste atenção - elas começarão a ser coletadas em um pacote apenas se todas as notificações não puderem caber na tela por vez. Por exemplo, na tela do iPhone 8 para isso, você precisa colocar 5 ou mais notificações.



Para não sobrecarregar esse material, coloquei as informações em um artigo separado .


Alterações na API NSExtensionContext


O próximo item são novas oportunidades para notificações e, em particular, a classe NSExtensionContext . Ele é responsável por interagir com os widgets Siri, reproduzindo conteúdo de mídia. Estamos mais interessados ​​em notificações. Dois métodos e uma variável foram adicionados:


var notificationActions: [UNNotificationAction] { get set } 

A variável permite substituir o conjunto de ações disponíveis durante a interação com a notificação:


 func dismissNotificationContentExtension() func performNotificationDefaultAction() 

Os métodos abrem o aplicativo ou ocultam a notificação.


Para demonstrar as possibilidades, escreveremos um pequeno aplicativo.


Primeiro, adicione ao aplicativo que envia notificações locais:


 let actions = [ UNNotificationAction(identifier: "like-action", title: "Like", options: []), UNNotificationAction(identifier: "open-app", title: "Open App", options: []), UNNotificationAction(identifier: "dismiss", title: "Dismiss", options: []), ] let simpleCategory = UNNotificationCategory(identifier: "category-simple", actions: actions, intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([simpleCategory]) 

  • Criamos algumas ações. O cabeçalho, um identificador que permite distinguir entre ações e opções de processamento, é passado para o inicializador. As opções podem indicar que a autenticação do usuário é necessária para concluir a ação.
  • Definimos uma categoria com um identificador. O identificador da categoria permite processar e exibir diferentes tipos de notificações de maneiras diferentes.
  • A última etapa é definir a categoria para o centro de notificação.

O segundo método enviará uma notificação local após um período especificado, para que possamos minimizar o aplicativo ou bloquear o telefone:


 UNUserNotificationCenter.current().getNotificationSettings { (settings) in guard settings.authorizationStatus == .authorized else { return } let content = UNMutableNotificationContent() content.title = "Cat Title" content.subtitle = "Cat Subtitle" content.body = "Cat Body" content.sound = .default content.categoryIdentifier = "category-simple" let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false) let uuid = UUID().uuidString let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger) UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in }) } 

  • Verifique se o usuário nos permitiu enviar notificações.
  • Criamos uma notificação com um cabeçalho e um texto e indicamos a categoria à qual ele pertencerá. Nesse caso, "categoria simples".
  • Defina o gatilho após 3 segundos.
  • Preencha a solicitação para enviar uma notificação. Nesse caso, usamos o UUID como um identificador. Esse identificador pode ser necessário se quisermos cancelar a notificação agendada.
  • Adicione nossa solicitação ao centro de notificação.

Em seguida, você precisa adicionar um novo destino de Extensão de Conteúdo de Notificação ao aplicativo. Permite personalizar a exibição de notificações e o processamento de ações.



Um arquivo plist, ViewController e Storyboard será criado:



No arquivo plist, estamos interessados ​​nas seguintes chaves:


  • UNNotificationExtensionCategory - o nome da categoria que será processada. Como antes, especifique "categoria simples".
  • UNNotificationExtensionInitialContentSizeRatio - a proporção entre a altura da notificação e a sua largura. Afeta o tamanho da notificação após a exibição completa.
  • UNNotificationExtensionUserInteractionEnabled - ative ou desative a interação com controles personalizados. No nosso caso, será um botão com um coração.
  • UNNotificationExtensionDefaultContentHidden - oculta o conteúdo da notificação, que é gerada por padrão.

No storyboard, crie UIImageView, UILabel para exibir o título da notificação e UIButton para interagir com o aplicativo.



No View Controller, criamos métodos para abrir o aplicativo e ocultar a notificação:


 func openApp() { extensionContext?.performNotificationDefaultAction() } func dismissNotification() { extensionContext?.dismissNotificationContentExtension() } 

Implementamos os métodos do protocolo UNNotificationContentExtension .


O primeiro permitirá que você exiba o texto necessário:


 func didReceive(_ notification: UNNotification) { self.notificationTitleLabel.text = notification.request.content.body } 

O segundo é necessário para lidar com ações de UNNotificationAction . No mesmo método, as ações são substituídas usando a atribuição extensionContext? .NotificationActions :


 func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) { switch response.actionIdentifier { case "like-action": let actions = [ UNNotificationAction(identifier: "1-star", title: "★", options: []), UNNotificationAction(identifier: "2-star", title: "★ ★", options: []), UNNotificationAction(identifier: "3-star", title: "★ ★ ★", options: []), ] extensionContext?.notificationActions = actions case "open-app": openApp() default: dismissNotification() } } 

O processamento de toques cardíacos é realizado como de costume no IBAction :


 @IBAction func defaultButtonTapped(_ sender: UIButton) { openApp() } 


Iniciamos o aplicativo e vemos o que obtemos:


  • As prensas do UIButton são processadas.
  • O uso de UNNotificationAction permite substituir as opções disponíveis para interação.

Interação com configurações de notificação


A inovação a seguir permite adicionar um novo item de menu às configurações de notificação. Quando você toca nele, será chamado um método que você pode implementar no aplicativo. Por exemplo, um usuário pode acessar diretamente seu aplicativo nas configurações do sistema e incluir apenas as notificações que ele realmente deseja receber. O que precisa ser feito para a implementação?


Primeiro, ao autorizar notificações, adicionamos mais um parâmetro - forneceAppNotificationSettings :


 UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound, .providesAppNotificationSettings]) 

Em segundo lugar, implementamos o método userNotificationCenter (_: openSettingsFor :) do protocolo UNUserNotificationCenterDelegate :


 extension AppDelegate: UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { openSettings() } func openSettings() { let storyboard = UIStoryboard(name: "Settings", bundle: nil) let settings = storyboard.instantiateViewController(withIdentifier: "Settings") window?.rootViewController = settings } } 


Notificações provisórias


O usuário nem sempre entende se ele deseja receber notificações do seu aplicativo. Portanto, quando você inicia o aplicativo pela primeira vez, é difícil para ele fazer essa escolha. Com uma alta probabilidade, ele recusará sua oferta. Para tais situações, a Apple sugere usar a Autorização Provisória. Ao solicitar autorização para enviar notificações, mais um parâmetro é adicionado - provisório . O status de autorização para essas notificações também entra no aplicativo com status provisório .


 UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .provisional]) 

O usuário não receberá uma solicitação de autorização ao iniciar o aplicativo. No entanto, para não incomodá-lo, o pedido é colocado na chamada prisão . Para notificações, sons, emblemas estão desativados; eles são exibidos apenas na Central de Notificações. Eles não aparecerão na tela bloqueada ou na forma de banners.


Quando um usuário recebe uma notificação, dois botões adicionais são exibidos. Um bloqueará completamente as notificações ou se oferecerá para ir para as configurações, e o segundo converterá suas notificações em status autorizado:



Alertas críticos


A alteração mais recente adiciona outro tipo de notificação - Alertas críticos . Essas notificações ignoram completamente as configurações do telefone, o som silenciado ou o modo não perturba. A Apple recomenda usá-los em aplicações médicas (por exemplo, o nível de açúcar aumentou bastante no usuário do dispositivo), além de garantir a segurança dos usuários em casa ou em locais públicos.


A solicitação de autorização contém um caractere especial:



Um novo item é adicionado nas configurações e um ícone adicional é exibido na tela de notificação:



Para enviar notificações críticas, você terá que passar pelo processo de validação do seu aplicativo no site da Apple .


Para usar notificações, use o parâmetro criticalAlert :


 UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .criticalAlert]) 

E formamos o conteúdo da notificação:


 let content = UNMutableNotificationContent() content.title = "WARNING" content.body = "Storm alert" content.categoryIdentifier = "storm-alert" content.sound = UNNotificationSound.defaultCriticalSound(withAudioVolume: 1.0) 

Para alertas críticos, você pode especificar o volume com o qual a notificação será acionada, independentemente das configurações do usuário.


Espero que este material simplifique o processo de introdução de novas notificações em seu aplicativo. Se você não conseguiu descobrir algumas etapas da implementação, sugiro que você se familiarize com o código no github ou faça uma pergunta nos comentários.


Você também pode assistir a um artigo da e-Legion sobre notificações para iOS 10 ou a uma gravação de relatório da WWDC - Novidades nas notificações do usuário. Poderemos discutir as inovações na MBLT DEV 2018 em Moscou, no dia 28 de setembro.


Tenha um bom dia e focas para todos ^ _ ^


UPD: A segunda parte do artigo sobre o agrupamento de notificações já em Habré.

Source: https://habr.com/ru/post/pt416307/


All Articles