# Guia de integração avançada do SDK para iOS 7.0+

import { Badge } from '@astrojs/starlight/components';

Esta seção fornece informações sobre a integração avançada do SDK Pushwoosh para iOS.

## Modos de segundo plano

<Aside type="caution" title="">
Por padrão, o iOS não permite que os aplicativos processem notificações push quando estão em segundo plano. Isso inclui notificações push silenciosas, que são úteis para atualizar os dados do aplicativo sem a interação do usuário.
</Aside>

Para habilitar essa funcionalidade, você deve adicionar os Modos de Segundo Plano (Background Modes) ao seu projeto.


#### Passos para habilitar os modos de segundo plano

1. Abra seu projeto no **Xcode** e selecione-o no **Project Navigator**.
2. Escolha o alvo (target) do seu aplicativo no painel esquerdo.
3. Navegue para a aba **Signing & Capabilities**.
4. Clique no botão **+ Capability** no canto superior esquerdo.
5. Procure e selecione **Background Modes** na lista.
6. Na seção **Background Modes**, habilite **Remote notifications** marcando a caixa.

Após a conclusão, seu aplicativo poderá lidar com notificações push, incluindo as silenciosas, enquanto estiver em execução em segundo plano.

## Modos de primeiro plano

Por padrão, o SDK Pushwoosh para iOS exibe o banner de notificação quando o aplicativo está em execução em primeiro plano.

Você pode controlar esse comportamento definindo a seguinte flag booleana em seu código (ou seja, em seu `AppDelegate`):

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    // Defina como false para desabilitar as notificações em primeiro plano, true para habilitá-las
    Pushwoosh.configure.showPushnotificationAlert = true
    ```

    <LinkCard
        title="Exemplo (Swift)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/ViewController.swift#L30"
    />

  </TabItem>

  <TabItem label="Objective-C">

  ```objective-c
  // Defina como 0 para desabilitar as notificações em primeiro plano, 1 para habilitá-las
  [[Pushwoosh configure] setShowPushnotificationAlert:0];
  ```

    <LinkCard
        title="Exemplo (Objective-C)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/ViewController.m#L35"
    />

  </TabItem>
</Tabs>

## Nível de log

O SDK Pushwoosh para iOS suporta os seguintes níveis de log:

- `NONE` - Nenhum log do SDK.
- `ERROR` - Exibe apenas mensagens de erro no console.
- `WARNING` - Exibe avisos além dos erros.
- `INFO` - Inclui mensagens informativas (configuração padrão).
- `DEBUG` - Inclui informações detalhadas de depuração.

Por padrão, o nível de log é definido como INFO, garantindo que o SDK forneça informações relevantes sem sobrecarregar o console do desenvolvedor.

Para modificar o nível de log, atualize a chave `Pushwoosh_LOG_LEVEL` no arquivo `Info.plist` do seu aplicativo:

```xml
<key>Pushwoosh_LOG_LEVEL</key>
<string>YOUR_LOG_LEVEL</string>
```

Alternativamente, você pode alterar o nível de log usando o trecho de código abaixo:

```swift
Pushwoosh.Debug.setLogLevel(.PW_LL_DEBUG)
```

Substitua `YOUR_LOG_LEVEL` pelo nível desejado (por exemplo, `DEBUG` ou `ERROR`).

## `UNNotificationCenterDelegate` personalizado

Se você quiser usar seu próprio `UNNotificationCenterDelegate` (por exemplo, para notificações locais), você deve informar o SDK da Pushwoosh sobre isso para um comportamento adequado. Você pode fazer isso com o método `addNotificationCenterDelegate`:

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    Pushwoosh.configure.addNotificationCenterDelegate(my_delegate)
    ```

    <LinkCard
        title="Exemplo (Swift)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Custom%20UNNotificationCenterDelegate/CustomNotificationCDViewConrtoller.swift#L23"
    />

    </TabItem>

    <TabItem label="Objective-C">
    ```objective-c
    [Pushwoosh.configure addNotificationCenterDelegate:my_delegate];
    ```

    <LinkCard
        title="Exemplo (Objective-C)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Custom%20UNNotificationCenterDelegate/PWCustomNotificationCDViewConrtoller.m#L28"
    />

    </TabItem>
</Tabs>

Em seguida, implemente os métodos `UNNotificationCenterDelegate` em seu delegate:

<Tabs syncKey="code-example">
  <TabItem label="Swift">

  ```swift
  func userNotificationCenter(
      _ center: UNUserNotificationCenter,
      willPresent notification: UNNotification,
      withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
  ) {
      if (!PWMessage.isPushwooshMessage(notification.request.content.userInfo)) {
          // Lide com sua notificação
          completionHandler(UNNotificationPresentationOptions.alert)
      }
  }

  func userNotificationCenter(
      _ center: UNUserNotificationCenter,
      didReceive response: UNNotificationResponse,
      withCompletionHandler completionHandler: @escaping () -> Void
  ) {
      if (!PWMessage.isPushwooshMessage(response.notification.request.content.userInfo)) {
          // Lide com sua notificação
          completionHandler()
      }
  }
  ```

  <LinkCard title="Exemplo (Swift)" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Custom%20UNNotificationCenterDelegate/CustomNotificationCDViewConrtoller.swift" />

  </TabItem>

  <TabItem label="Objective-C">

  ```objective-c
  - (void)userNotificationCenter:(UNNotificationCenter *)center
          willPresentNotification:(UNNotification *)notification
          withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
      if (![PWMessage isPushwooshMessage:notification.request.content.userInfo]) {
          // Lide com sua mensagem
          completionHandler(UNNotificationPresentationOptionAlert);
      }
  }

  - (void)userNotificationCenter:(UNNotificationCenter *)center
          didReceiveNotificationResponse:(UNNotificationResponse *)response
          withCompletionHandler:(void (^)(void))completionHandler {
      if (![PWMessage.isPushwooshMessage:response.notification.request.content.userInfo]) {
          // Lide com sua mensagem
          completionHandler();
      }
  }
  ```

  <LinkCard title="Exemplo (Objective-C)" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Custom%20UNNotificationCenterDelegate/PWCustomNotificationCDViewConrtoller.m" />

  </TabItem>
</Tabs>

## Inicialização Lenta da Pushwoosh

A flag `Pushwoosh_LAZY_INITIALIZATION` impede a inicialização automática do SDK da Pushwoosh quando o aplicativo é iniciado. Isso permite um maior controle sobre quando os serviços do SDK da Pushwoosh são iniciados.

Quando esta flag está habilitada, o SDK da Pushwoosh não inicia seus serviços até que os métodos do SDK Pushwoosh para iOS sejam explicitamente chamados.

Adicione a seguinte entrada ao Info.plist:

```xml
<key>Pushwoosh_LAZY_INITIALIZATION</key>
<true/>
```

**Casos de Uso**
1. **Inicialização Controlada do SDK** – A flag Pushwoosh_LAZY_INITIALIZATION permite atrasar o início do SDK da Pushwoosh, dando mais controle sobre quando os serviços de push são ativados.

2. **Ativação Adiada de Push** – Em alguns aplicativos, as notificações push só devem ser inicializadas sob condições específicas. Habilitar esta flag garante que o SDK da Pushwoosh inicie apenas quando explicitamente solicitado.

3. **Configuração de Push Específica do Usuário** – Alguns aplicativos podem exigir a personalização das configurações de notificação push com base nas preferências do usuário ou nas configurações da conta. Com a inicialização lenta, o SDK da Pushwoosh inicia somente após a determinação da configuração apropriada.
## Lista completa de propriedades do Info.plist

| Propriedade                                      | Descrição                                                                  | Valores Possíveis                                                                                  |
|-----------------------------------------------|------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
| `Pushwoosh_APPID`                             | Define o ID do aplicativo Pushwoosh para a compilação de produção.                     | `XXXXX-XXXXX` <br /> **Tipo**: String                                                             |
| `Pushwoosh_APPID_Dev`                         | Define o ID do aplicativo Pushwoosh para a compilação de desenvolvimento.                    | `XXXXX-XXXXX` <br /> **Tipo**: String                                                             |
| `Pushwoosh_SHOW_ALERT`                        | Mostra o alerta de notificação em primeiro plano.                                        | `YES` *(padrão)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALERT_TYPE`                        | Define o estilo do alerta de notificação.                                          | `BANNER` *(padrão)* / `ALERT` / `NONE` <br /> **Tipo**: String                                   |
| `Pushwoosh_BASEURL`                           | Substitui a URL base do servidor Pushwoosh.                                    | [`https://cp.pushwoosh.com/json/1.3/`](https://cp.pushwoosh.com/json/1.3/) *(padrão)* <br /> **Tipo**: String |
| `Pushwoosh_AUTO_ACCEPT_DEEP_LINK_FOR_SILENT_PUSH` | Se `YES`, os Deep Links recebidos em pushes silenciosos serão processados automaticamente. | `YES` *(padrão)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_SERVER_COMMUNICATION`        | Permite que o SDK envie solicitações de rede para os servidores Pushwoosh.               | `YES` *(padrão)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_DATA`      | Permite que o SDK colete e envie dados do dispositivo (versão do SO, localidade e modelo) para o servidor. | `YES` *(padrão)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_OS_VERSION` | Permite que o SDK colete e envie a versão do SO do dispositivo para o servidor.   | `YES` *(padrão)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_LOCALE`    | Permite que o SDK colete e envie a localidade do dispositivo para o servidor.         | `YES` *(padrão)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_MODEL`     | Permite que o SDK colete e envie o modelo do dispositivo para o servidor.          | `YES` *(padrão)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_LOG_LEVEL`                         | Nível de log do SDK da Pushwoosh. Para detalhes, consulte [Controlando o Nível de Log](#log-level). | `NONE` / `ERROR` / `WARNING` / `INFO` *(padrão)* / `DEBUG` / `VERBOSE` <br /> **Tipo**: String    |
| `Pushwoosh_PURCHASE_TRACKING_ENABLED`         | Permite que o SDK rastreie compras no aplicativo. Necessário para o Customer Journey Builder. | `YES` / `NO` *(padrão)* <br /> **Tipo**: Boolean                                                 |