# Personalização de push no iOS

Quando um dispositivo iOS recebe uma notificação contendo um alerta, o sistema exibe o conteúdo do alerta em duas etapas. Inicialmente, ele exibe um banner abreviado com o título, subtítulo e duas a quatro linhas do corpo do texto da notificação. Se o usuário pressionar o banner abreviado, o iOS exibe a interface completa da notificação, incluindo quaisquer ações relacionadas à notificação. O sistema fornece a interface para o banner abreviado, mas você pode personalizar a interface completa usando uma extensão de aplicativo de conteúdo de notificação.

<img src="/ios-push-notifications-ios-push-customization-1.webp" alt=""/>

A extensão de aplicativo de conteúdo de notificação gerencia um view controller que exibe sua interface de notificação personalizada. Este view controller pode complementar ou substituir a interface padrão do sistema para suas notificações. Você pode usar seu view controller para:

*   Personalizar o posicionamento dos itens, incluindo o título, subtítulo e corpo do texto do alerta.
*   Substituir fontes ou estilos diferentes para elementos da interface.
*   Exibir dados específicos do aplicativo — por exemplo, dados armazenados em chaves específicas do aplicativo no payload da notificação.
*   Incluir imagens personalizadas ou branding.

Sua extensão de aplicativo deve configurar seu view controller usando os dados imediatamente disponíveis, como o conteúdo da notificação e os arquivos presentes no pacote da sua extensão de aplicativo. Se você usar um grupo de aplicativos para compartilhar dados entre seu aplicativo e sua extensão de aplicativo, também poderá usar quaisquer arquivos encontrados no grupo de aplicativos. Para garantir que suas notificações sejam entregues em tempo hábil, configure as visualizações o mais rápido possível. Não execute tarefas de longa duração, como tentar recuperar dados pela rede.

<Aside type="caution">
Extensões de aplicativo de conteúdo de notificação são suportadas apenas em aplicativos iOS.
</Aside>

### Adicione a extensão de aplicativo de conteúdo de notificação ao seu projeto

Para adicionar uma extensão de aplicativo de conteúdo de notificação ao seu aplicativo iOS:

1.  Escolha **File** > **New** > **Target** no Xcode.
2.  Selecione **Notification Content Extension** em iOS Application Extension.
3.  Clique em **Next**.
4.  Forneça um **nome** para a sua extensão de aplicativo.
5.  Clique em **Finish**.

### Adicione visualizações ao seu view controller

O modelo fornecido pelo Xcode inclui um storyboard e um view controller para você configurar. Construa sua interface de notificação personalizada adicionando visualizações ao seu view controller. Por exemplo, use rótulos para exibir o título, subtítulo e corpo do texto da notificação. Você também pode adicionar visualizações de imagem e visualizações que exibem conteúdo não interativo. Você não precisa fornecer nenhum conteúdo inicial para suas visualizações.

Você pode adicionar controles interativos (por exemplo, botões ou interruptores) no iOS 12 e posterior. Para mais informações, consulte Suporte a Controles Interativos.

<Aside type="caution">
Não adicione view controllers adicionais à sua extensão de aplicativo ou arquivo de storyboard. Sua extensão de aplicativo deve conter exatamente um view controller.
</Aside>

### Configure seu view controller

Use o método `didReceive(_:)` do seu view controller para atualizar seus rótulos e outras visualizações. O payload da notificação contém os dados a serem usados ao configurar seu view controller. Você também pode usar dados de outros arquivos da sua extensão de aplicativo. A [Listagem 1](https://developer.apple.com/documentation/usernotificationsui/customizing_the_appearance_of_notifications#2950663) mostra uma versão deste método que recupera o título e o corpo do texto do payload da notificação e atribui as strings a dois controles [`UILabel`](https://developer.apple.com/documentation/uikit/uilabel), que são armazenados como outlets no view controller.

<Tabs>
<TabItem label="Swift">
```swift
// Configuring the notification interface at runtime

func didReceive(_ notification: UNNotification) {
   self.bodyText?.text = notification.request.content.body
   self.headlineText?.text = notification.request.content.title
}
```
</TabItem>
</Tabs>

Se uma segunda notificação chegar quando seu view controller já estiver visível, o sistema chamará o método `didReceive(_:)` novamente com o novo payload da notificação.

### Suporte a controles interativos
No iOS 12 e posterior, você pode habilitar interações do usuário em suas notificações personalizadas. Isso permite que você adicione controles interativos, como botões e interruptores, à sua interface personalizada.

Para habilitar as interações do usuário:

1.  Abra o arquivo `info.plist` da sua Extensão de Conteúdo de Notificação.
2.  Adicione a chave `UNNotificationExtensionUserInteractionEnabled` aos atributos da sua extensão. Dê a ela um valor booleano, definido como `YES`.

<img src="/ios-push-notifications-ios-push-customization-2.webp" alt="Habilitando interações do usuário no arquivo info.plist da extensão de notificação"/>

### Adicione o Apple Pay à sua extensão de notificação push (visualização de exemplo)
<br />
<img
  src="/ios-push-notifications-ios-push-customization-3.webp"
  alt=""
  style={{ display: "block", margin: "0 auto", maxWidth: "60%", height: "auto" }}
  width="400"
/>

### Exemplo de bloco de código com o botão Apple Pay na extensão de Notificação Push

<Tabs>
<TabItem label="Swift">
```swift
import UIKit
import Foundation
import UserNotifications
import UserNotificationsUI
import PassKit

class NotificationViewController: UIViewController, UNNotificationContentExtension, PKPaymentAuthorizationViewControllerDelegate {


    func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
        controller.dismiss(animated: true, completion: nil)
    }


    @IBOutlet weak var buyWithApplePayButton: UIButton!
    @IBOutlet weak var containerView: UIView!
    @IBOutlet weak var payInAppButton: UIButton!
    @IBOutlet weak var segmentCustom: UISegmentedControl!

    private var amount: NSDecimalNumber = 0;

    override func viewDidLoad() {
        super.viewDidLoad()

        buttonCustomisation()

        amount = NSDecimalNumber.init(value: 5)
    }

    func buttonCustomisation () {
        self.buyWithApplePayButton.layer.masksToBounds = true
        self.buyWithApplePayButton.layer.cornerRadius = 10
        self.payInAppButton.layer.masksToBounds = true
        self.payInAppButton.layer.cornerRadius = 10
        self.containerView.layer.borderColor = UIColor.gray.cgColor
        self.containerView.layer.borderWidth = 0.7
        self.containerView.layer.masksToBounds = true
        self.containerView.layer.cornerRadius = 20
    }

    func didReceive(_ notification: UNNotification) {
        // Configuring the notification interface at runtime
    }

    @IBAction func buyWithApplePayAction(_ sender: Any) {
        let request = PKPaymentRequest()
        request.merchantIdentifier = "merchant.com.sample.ApplePayAction"
        request.supportedNetworks = [PKPaymentNetwork.visa, PKPaymentNetwork.masterCard, PKPaymentNetwork.amex]
        request.merchantCapabilities = PKMerchantCapability.capability3DS
        request.countryCode = "US"
        request.currencyCode = "USD"

        request.paymentSummaryItems = [
            PKPaymentSummaryItem(label: "Some Product", amount: amount)
        ]

        let applePayController = PKPaymentAuthorizationViewController(paymentRequest: request)
        applePayController?.delegate = self
        self.present(applePayController!, animated: true, completion: nil)
    }

    @IBAction func payInAppButtonAction(_ sender: Any) {
        print("pay in app button tapped")
    }

    @IBAction func segmentAction(_ sender: Any) {
        switch segmentCustom.selectedSegmentIndex {
        case 0:
            amount = NSDecimalNumber.init(value: 5)
            break
        case 1:
            amount = NSDecimalNumber.init(value: 10)
            break
        case 2:
            amount = NSDecimalNumber.init(value: 20)
            break
        default:
            amount = NSDecimalNumber.init(value: 5)
            break
        }
    }
}
```
</TabItem>
</Tabs>