# Pré-solicitação de push para iOS

Uma pré-solicitação de push é uma caixa de diálogo de opt-in suave que você exibe **antes** da solicitação de permissão de push do sistema iOS. O iOS exibe a solicitação do sistema apenas uma vez por instalação — se o usuário tocar em **Não Permitir**, o push é perdido até que ele o reative nos Ajustes. A pré-solicitação permite que você explique o valor primeiro e pergunte no momento certo, para que você use a única chance da solicitação do sistema com usuários que já disseram sim.

Disponível desde a versão 7.1.1. A pré-solicitação faz parte do `PushwooshFramework`; nenhum módulo extra é necessário.

<figure style={{ textAlign: "center" }}>
  <img
    src="/ios-push-primer-1.webp"
    alt="Caixa de diálogo de pré-solicitação de push exibida antes da solicitação de permissão do sistema"
    style={{ display: "block", margin: "0 auto", maxWidth: "300px", height: "auto" }}
    width="300"
  />
  <figcaption>Pré-solicitação de push exibida antes da solicitação de permissão do sistema iOS</figcaption>
</figure>

## Como funciona

A pré-solicitação é totalmente ciente do estado. Ela lê o status atual de autorização de notificação e decide o que fazer, então é seguro chamá-la a cada inicialização:

-   **Não determinado** — exibe a pré-solicitação; ao aceitar, aciona a solicitação de permissão do sistema.
-   **Autorizado ou provisório** — suprime silenciosamente a pré-solicitação (nada é exibido).
-   **Negado** — exibe a pré-solicitação; ao aceitar, encaminha o usuário para as configurações de notificação do aplicativo (quando `fallbackToSettings` está ativado).

Você decide **quando** chamar a pré-solicitação (por exemplo, após a integração do usuário ou após uma ação principal). O SDK não impõe nenhum tempo próprio, exceto pela limitação opcional `minInterval` descrita abaixo.

## Uso básico

Configure a pré-solicitação com um construtor fluente e chame `present`. A configuração mínima precisa de um título, uma mensagem e os títulos dos dois botões.

<Tabs>
<TabItem label="Swift">
```swift
import PushwooshFramework

Pushwoosh.configure.pushPrimer
    .title("Fique por dentro")
    .message("Receba notificações sobre ofertas e atualizações de pedidos primeiro")
    .acceptButton("Ativar notificações")
    .declineButton("Agora não")
    .present()
```
</TabItem>
</Tabs>

<Aside type="note">
Chame a pré-solicitação depois que a interface do usuário do aplicativo estiver na tela (por exemplo, um pouco após o lançamento ou em uma etapa deliberada do seu fluxo), para que ela possa ser apresentada sobre sua interface.
</Aside>

## Estilos e posições

Use `style` para escolher entre um alerta do sistema e uma folha personalizada, e `position` para posicionar a folha personalizada. Cada posição tem seu próprio design padrão.

| Valor | Descrição |
|-------|-------------|
| `.alert` | `UIAlertController` do sistema. A posição é ignorada. |
| `.sheet` + `.bottom` | Folha inferior que desliza para cima, com um puxador e botões de largura total (padrão). |
| `.sheet` + `.top` | Banner compacto que desce do topo, como uma notificação. |
| `.sheet` + `.center` | Caixa de diálogo centralizada que aumenta de escala e aparece gradualmente. |

<Tabs>
<TabItem label="Swift">
```swift
Pushwoosh.configure.pushPrimer
    .style(.sheet)
    .position(.top)
    .title("Fique por dentro")
    .message("Receba notificações sobre ofertas e atualizações de pedidos primeiro")
    .acceptButton("Ativar notificações")
    .declineButton("Agora não")
    .present()
```
</TabItem>
</Tabs>

<img src="/ios-push-primer-positions.webp" alt="Pré-solicitação de push nas posições inferior, superior e central"/>

## Personalização

Todas as configurações visuais são opcionais — omita-as para usar os padrões nativos que se adaptam aos modos claro e escuro.

<Tabs>
<TabItem label="Swift">
```swift
Pushwoosh.configure.pushPrimer
    .style(.sheet)
    .position(.center)
    .title("Fique por dentro")
    .message("Receba notificações sobre ofertas e atualizações de pedidos primeiro")
    .acceptButton("Ativar notificações")
    .declineButton("Agora não")
    .image(UIImage(named: "PrimerHero"))          // local image, or .imageURL("https://…")
    .backgroundColor(.systemBackground)
    .titleColor(.label)
    .messageColor(.secondaryLabel)
    .acceptButtonColor(.systemBlue)
    .acceptButtonTextColor(.white)
    .declineButtonColor(.clear)
    .declineButtonTextColor(.secondaryLabel)
    .cornerRadius(24)
    .buttonCornerRadius(14)
    .buttonBorderColor(.separator)
    .present()
```
</TabItem>
</Tabs>

Referência de personalização:

| Setter | Descrição |
|--------|-------------|
| `image` / `imageURL` | Um `UIImage` local ou um URL remoto. Renderizado como um círculo nos layouts central e inferior, e como o ícone no banner superior. Uma imagem local tem precedência sobre um URL. |
| `backgroundColor` | Cor de fundo sólida do cartão. |
| `backgroundGradient` | Um array de cores renderizado como um gradiente suave multicolorido. Sobrescreve `backgroundColor`. |
| `titleColor` / `messageColor` | Cores do texto do título e da mensagem. |
| `acceptButtonColor` / `acceptButtonTextColor` | Cores de fundo e do texto do botão de aceitar. A cor de aceitar também tinge o ícone padrão. |
| `declineButtonColor` / `declineButtonTextColor` | Cores de fundo e do texto do botão de recusar. |
| `cornerRadius` | Raio do canto do cartão. |
| `buttonCornerRadius` / `buttonBorderColor` | Raio do canto e cor da borda de ambos os botões. |

<Aside type="note">
A pré-solicitação exibe exatamente as strings que você passa. Para vários idiomas, passe strings localizadas (por exemplo, com `NSLocalizedString`).
</Aside>

## Configurações de comportamento

### Fallback para Ajustes

Por padrão, quando as notificações já estão negadas, a pré-solicitação é exibida e o botão de aceitar leva o usuário para as configurações de notificação do aplicativo. Passe `false` para suprimir completamente a pré-solicitação no estado negado.

```swift
.fallbackToSettings(false)
```

### Frequência de exibição

Por padrão, a pré-solicitação não tem limitação integrada — ela é exibida sempre que você chama `present` (e é suprimida automaticamente assim que as notificações são autorizadas). Use `minInterval` para limitar a frequência com que a pré-solicitação reaparece. A última vez que foi exibida é mantida entre as inicializações.

```swift
.minInterval(7 * 24 * 60 * 60)   // show at most once a week
```

## Lidando com o resultado

Passe uma conclusão para `present` para reagir ao resultado.

<Tabs>
<TabItem label="Swift">
```swift
Pushwoosh.configure.pushPrimer
    .title("Fique por dentro")
    .message("Receba notificações sobre ofertas e atualizações de pedidos primeiro")
    .acceptButton("Ativar notificações")
    .declineButton("Agora não")
    .present { outcome in
        switch outcome {
        case .accepted:            break   // shown, user accepted, system prompt requested
        case .declined:            break   // shown, user declined
        case .suppressed:          break   // not shown (already authorized, or throttled)
        case .redirectedToSettings: break  // denied state, user sent to Settings
        @unknown default:          break
        }
    }
```
</TabItem>
</Tabs>

O resultado final da solicitação do sistema (o estado concedido/negado e o token do dispositivo) chega através dos callbacks de registro regulares — a pré-solicitação reutiliza `registerForPushNotifications` ao aceitar e não duplica essa cadeia.

## Referências

<CardGrid>
  <LinkCard
    title="Referência da API do SDK para iOS"
    description="Documentação técnica completa cobrindo todas as classes, métodos e propriedades públicas."
    href="https://pushwoosh.github.io/pushwoosh-ios-sdk/"
  />
  <LinkCard
    title="Personalizando o SDK para iOS"
    description="Outras maneiras de adaptar o SDK Pushwoosh para iOS ao seu aplicativo."
    href="/developer/pushwoosh-sdk/ios-sdk/customizing-ios-sdk/"
  />
</CardGrid>