Advertisement
  1. Code
  2. iOS

Introdução ao Framework UserNotificationsConfigurando Push Notifications no iOS

by
Difficulty:IntermediateLength:LongLanguages:

Portuguese (Português) translation by David Batista (you can also view the original English article)

Introdução

Com o iOS 10, tvOS 10 e o watchOS 2, a apple está introduzindo um novo framework chamado UserNotifications. Este novo conjunto de APIs fornece uma forma unificada e orientada a objetos de trabalhar com notificações locais e remotas nestas plataformas. Isto é particularmente útil porque, em comparação com as APIs existentes, as notificações locais e remotas agora são tratadas de forma muito semelhantes e o acesso ao conteúdo da notificação já não é feito apenas através de dicionários.

Neste tutorial, analisarei o básico deste novo framework e mostrarei como você pode facilmente tirar vantagem dele para dar suporte a notificações em seu aplicativo.

Este tutorial requer que você esteja rodando o Xcode 8 com a ultima versão dos SDKs iOS, tvOS e watchOS.

1. Registrando notificações

O primeiro passo para qualquer app dar suporte a notificações é solicitar a permissão do usuário. Como nas versões anteriores de iOS, quando estamos usando o framework UserNotifications, é uma prática comum fazer isso logo que finalizamos a inicialização do app.

Antes de usar qualquer uma das APIs do UserNotifications, você precisará adicionar a seguinte instrução de importação em todos os arquivos de código que acessar o framework:

Em seguida, para registar as notificações em seu app, você precisará adicionar o seguinte código no método application(_:didFinishLaunchingWithOptions:) do AppDelegate.

Inicialmente com este código, obtemos uma referência do objeto UNUserNotificationCenter atual. Em seguida, configuramos nosso UNAuthorizationOptions com as funcionalidades que nossa notificação do app terá. Por favor, note que você pode ter qualquer combinação de opções aqui - por exemplo, apenas alert ou ambos badge e sound.

Usando esses objetos, solicitamos autorização para nosso app exibir notificações chamando o método requestAuthorization(options:completionHandler:) na nossa instância UNUserNotificationCenter. O bloco completion handler do código tem dois parâmetros:

  • Um valor Bool informando se houve ou não autorização do usuário.
  • Um objeto Error opcional que conterá informações se, por alguma razão, o sistema não conseguiu solicitar a autorização para o seu app.

Você verá que no código acima, se houve autorização do usuário, nós então registramos a notificação remota. Se você quer implementar push notifications, esta linha de código é obrigatória. Você terá que fazer uma pequena configuração extra em seu projeto, como detalhado neste tutorial:

Por favor, note que para registrar notificações remotas é preciso chamar o mesmo método de callback UIApplication que as versões anteriores do iOS. Com sucesso, será chamado o application(_:didRegisterForRemoteNotificationsWithDeviceToken:) , e em caso de falha será chamado application(_:didFailToRegisterForRemoteNotificationsWithError:).

2. Agendando notificações

Nesta seção do tutorial, iremos focar inteiramente no agendamento de notificações locais usando o framework UserNotifications. O envio remoto de push notifications não teve alteração com a introdução deste novo framework.

Uma notificação local, antes de ser agendada, é representada pela instância da classe UNNotificationRequest. Objetos deste tipo são formados pelos seguintes componentes:

  • Identifier: uma String única que te permite distinguir individualmente as notificações.
  • Content: um objeto UNNotificationContent que contém todas as informações necessárias para exibir sua notificação, incluindo titulo, subtítulo e número de identificação do app.
  • Trigger: um objeto UNNotificationTrigger que é usado pelo sistema para determinar quando sua notificação deverá ser "enviada" para o seu app.

Para começar, iremos dar uma olhada nos vários tipos de triggers que você pode configurar para as notificações locais. A classe UNNotificationTrigger é uma classe abstrata, o que significa que você não deverá criar instâncias dela diretamente. Em vez disso, você usará as subclasses disponíveis. Atualmente, o framework UserNotifications fornece três para você:

  • UNTimeIntervalNotificationTrigger, que permite que uma notificação seja enviada após um período de tempo definido.
  • UNCalendarNotificationTrigger, que permite que uma notificação seja enviada em uma data e hora especificada, independente de quando ela foi agendada.
  • UNLocationNotificationTrigger, que permite que uma notificação seja enviada quando o usuário entrar ou sair de uma determinada região geográfica. 

O código a seguir mostra como você pode fazer um trigger de cada tipo:

Com o código acima, as seguintes condições de trigger foram criadas:

  • O timeTrigger irá disparar uma hora após a notificação for agendada. O parâmetro timeInterval passado no inicializador UNTimeIntervalNotificationTrigger é medido em segundos.
  • O calendarTrigger irá repetidamente disparar todo dia as 10 PM. A data e hora exata do disparo do trigger pode facilmente ser alterada modificando outra propriedade do objeto DateComponets que você passa no inicializador INCalendarNotificationTrigger.
  • O locationTrigger irá disparar quando o usuário estiver dentro de um raio de 500 metros da coordenada informada, neste caso 40°N 120°E. Como você pode ver no código, este tipo de trigger pode ser usado em qualquer coordenada e/ou tamanho de região e também dispara uma notificação ao entrar e sair da região.

Em seguida, precisamos criar o conteúdo para a notificação. Isso é feito criando uma instância da classe UNMutableNotificationContent. Essa classe deve ser usado como a classe UNNotificationContent regular tendo acesso somente leitura para as várias propriedades de conteúdo da notificação.

O código a seguir mostra como o conteúdo para uma notificação básica pode ser criada:

Se você quer uma lista completa das propriedades disponíveis, por favor dê uma olhada na referência da classe UNMutableNotificationContent

Por ultimo, precisamos criar o objeto UNNotificationRequest para agenda-la. Isso pode ser feito com o seguinte código:

No inicio do código, criamos o objeto de requisição passando no inicializador: um identificador, um objeto content e o trigger. Então chamamos o método add(_:completionHandler:) no objeto atual UNUserNotificationCenter e usamos o completion handler para executar a lógica baseada se a notificação foi ou não agendada corretamente.

3. Recebendo notificações

Quando usamos o framework UserNotification, o processamento da entrada das notificações é tratado por um objeto indicado por você e que esteja em conformidade com o protocolo UNUserNotificationCenterDelegate. Este objeto pode ser qualquer um que você queira e não precisa ser o app delegate como nas versões anteriores do iOS.

Uma coisa importante a se perceber, entretanto, é que você deve definir seu delegate antes do seu app ser totalmente iniciado. Para um app iOS, isso significa que você deve atribuir seu delegate dentro do método application(_:willFinishLaunchingWithOptions:) ou application(_:didFinishLaunchingWithOptions:) do seu app delegate. Atribuir o delegate para a user notifications é feito facilmente com o código a seguir:

Agora com seu delegate atribuído, quando uma notificação for recebida pelo app, há apenas dois métodos com os quais você precisa se preocupar. Ambos os métodos recebem um objeto UNNotification, que representa a notificação recebida. Este objeto contém uma propriedade date, que informa exatamente quando a notificação foi enviada, e uma propriedade request, que é uma instância da classe UNNotificationRequest mencionada anteriormente. Desse objeto de request, você pode acessar o conteúdo da notificação, bem como (se necessário) o trigger para a notificação. Este objeto trigger será uma instância da subclasse UNNotificationTrigger mencionada anteriormente ou, no caso de push notifications, uma instância da classe UNPushNotificationTrigger.

O primeiro método definido pelo protocolo UNUserNotificationCenterDelegate é o método userNotificationCenter(_:willPresent:withCompletionHandler:). Este é chamado apenas quando você está rodando seu app em primeiro plano e recebe uma notificação. A partir daqui, você pode acessar o conteúdo da notificação e, se necessário, exibir sua interface personalizada dentro do seu app. Como alternativa, você pode informar ao sistema para apresentar a notificação com uma variedade de opções, como normalmente faria se seu app não estivesse sendo executado. As opções disponiveis são:

  • Exibir a interface gerada pelo sistema para a notificação
  • Reproduzir o som associado a notificação
  • Apresentar o icone do seu aplicativo na tela home do usuário

O código a seguir mostra um exemplo de implementação do método userNotificationCenter(_:willPresent:withCompletionHandler:):

O outro método definido pelo protocolo UNUserNotificationCenterDelegate é o método userNotificationCenter(_:didReceive:withCompletionHandler:). Este método é chamado quando o usuário interage com uma notificação do seu app de alguma forma, incluindo ignorar ou abrir seu app por ela.

Ao invés de um objeto UNNotification, este método recebe um objeto UNNotificationResponse como parâmetro. Este objeto contém o objeto UNNotification que representa a notificação entregue. Isso também inclui uma propriedade actionIdentifier para determinar como o usuário interage com a notificação. No caso da notificação ser ignorada ou seu app ser aberto, o framework UserNotifications fornece identificadores de ação padrões para você poder compara-los. 

O código a seguir mostra um exemplo da implementação do método userNotificationCenter(_:didReceive:withCompletionHandler:):

Por favor, perceba que para ambos os métodos delegados, é essencial que você chame o completion handler assim que finalizar o processamento da notificação. Feito isso, o sistema sabe que você terminou com a notificação e pode executar qualquer processamento necessário, como colocar a notificação na Central de Notificação do usuário.

4. Gerenciando as notificaçãoes

As vezes um usuário do seu aplicativo pode receber múltiplas notificações enquanto seu app não esta em execução. Eles podem então abrir seu app diretamente pela tela de home e não através de uma notificação. Em qualquer destes casos, nenhum dos métodos do protocolo UNUserNotificationCenterDelegate será chamado. Ao trabalhar com notificações locais, às vezes você também pode querer remover uma notificação programada antes dela ser exibida ao usuário.

Por conta disso, o framework UserNotifications fornece os métodos a seguir em sua instância UNUserNotificationCenter para se trabalhar com notificações locais pendentes e notificações entregues que não foram processadas ainda:

  • getPendingNotificationRequests(completionHandler:) fornece a você um array de objetos UNNotificationRequest no completion handler. Este array irá conter as notificações locais que você programou e que ainda não foram acionadas.
  • removePendingNotificationRequests(withIdentifiers:) remove todas as notificações locais agendadas com o identificador existentes no array de String que você passar no parâmetro.
  • removeAllPendingNotificationRequests remove todas as notificações locais programadas para seu app.
  • getDeliveredNotifications(completionHandler:) fornece a você um array com objetos UNNotification no completion handler. Este array irá conter todas as notificações enviadas para seu app que ainda estão visíveis na Central de Notificações do usuário.
  • removeDeliveredNotifications(withIdentifiers:) remove todas as notificações entregues na Central de Notificações do usuário com o identificador existente no array de String que você passar.
  • removeAllDeliveredNotifications remove todas as notificações entregues a seu app.

5. Ações personalizadas de notificações

O framework UserNotifications também facilita para o seu app tirar vantagem das categorias e ações personalizadas de notificações introduzidas no iOS 8.

Primeiramente, você precisa definir as ações e categorias personalizadas que seu app irá suportar usando as classes UNNotificationAction e UNNotificationCategory, respectivamente. Para ações onde o usuário poderá inserir texto, você pode usar a classe UNTextInputNotificationAction, que é uma subclasse da UNNotificationAction. Uma vez que suas ações e categorias forem definidas, você precisará apenas chamar o método setNotificationCategories(_:) na instância atual da UNUserNotificationCenter. O código a seguir mostra como registrar facilmente as ações de responder e deletar para uma notificação de categoria mensagem no seu app:

Em seguida, quando o usuário usar uma das suas ações personalizadas, o mesmo método userNotificationCenter(_:didReceive:withCompletionHandler:) que vimos anteriormente será chamado. Neste caso, o identificador da ação do objeto UNNotificationResponse passado será o mesmo que definimos na ação personalizada. É importante notar que, se o usuário interagir com ação de input de texto da notificação, então o objeto de resposta passado neste método será do tipo UNTextInputNotificationResponse.

O código a seguir mostra um exemplo da implementação deste método, incluindo a lógica para as ações que criamos anteriormente:

Além disso, se você quer aproveitar as ações personalizadas em suas notificações locais, você pode simplesmente definir a propriedade categoryIdentifier em seu objeto UNMutableNotificationContent quando criar a notificação.

Conclusão

O novo framework UserNotification fornece funcionalidade total e facilita o uso das APIs orientadas a objetos para trabalhar com notificações locais e remotas no iOS, watchOS e tvOS. Ela torna muito fácil agendar notificações locais para uma variedade de cenários, bem como simplifica consideravelmente todo o fluxo de processamento das notificações recebidas e ações personalizadas. 

Como sempre, por favor certifique-se de deixar seus comentários e feedback nos comentários abaixo. E confira alguns de nossos outros artigos e tutoriais sobre os novos recursos do iOS 10 e watchOS 3!

Advertisement
Advertisement
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.