# Guia de integração básica do SDK Flutter

Esta seção contém informações sobre como integrar o SDK Flutter da Pushwoosh em seu aplicativo.

## Pré-requisitos

Para integrar o SDK Flutter da Pushwoosh em seu aplicativo, você precisará do seguinte:

<Aside type="note" title="Requisitos">
 - Uma [conta Pushwoosh](https://sso.pushwoosh.com/login).
 - Um [projeto Pushwoosh](/pt/product/first-steps/start-with-your-project/create-your-project) configurado em sua conta.
 - **Para integração com iOS:**
    - Uma plataforma iOS configurada para enviar notificações push. Recomendamos usar a [configuração de Autenticação Baseada em Token](/pt/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/) como a abordagem mais simples.
    - Defina o Gateway como `Sandbox` para enviar pushes para um simulador.
 - **Para integração com Android:**
    - Uma [plataforma Android configurada](/pt/developer/first-steps/connect-messaging-services/android-configuration/android-firebase-configuration)
    - O arquivo `google-services.json` e o `package name` do seu projeto Firebase.
    - Um projeto Firebase conectado ao seu aplicativo Android. Siga o [guia de configuração do Firebase](https://firebase.google.com/docs/android/setup#manually_add_firebase) se necessário.
 - O seu `Código do Aplicativo Pushwoosh` e o [Token da API do Dispositivo Pushwoosh](/pt/developer/api-reference/api-access-token/#device-api-token) do Painel de Controle da Pushwoosh para o seu aplicativo.
</Aside>

## Passos de integração

### 1. Adicionar Dependência do SDK Flutter da Pushwoosh

Adicione o pacote `pushwoosh_flutter` ao seu arquivo `pubspec.yaml`:

```yaml title="pubspec.yaml"
dependencies:
  flutter:
    sdk: flutter
  # Use the latest version from https://pub.dev/packages/pushwoosh_flutter
  pushwoosh_flutter: ^[LATEST_VERSION]
```
Verifique a [última versão](https://pub.dev/packages/pushwoosh_flutter) em pub.dev.

Em seguida, execute o seguinte comando no diretório raiz do seu projeto para instalar a dependência:

```bash
flutter pub get
```

Verifique novamente se o pacote está instalado corretamente:
```bash
flutter pub deps | grep pushwoosh_flutter

# Example output:
# ❯ flutter pub deps | grep pushwoosh_flutter
# └── pushwoosh_flutter 2.3.11
```

### 2. Inicialização do SDK Flutter

No componente raiz do seu arquivo `main.dart`:
- Importe o pacote `pushwoosh_flutter`.
- Inicialize o SDK da Pushwoosh.
- Chame `registerForPushNotifications()` na sua lógica de inicialização para se registrar para notificações push.

```dart title="main.dart"
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

void main() async {
  runApp(const MyApp());
  Pushwoosh.initialize({
    "app_id": "__YOUR_APP_ID__"
  });
  Pushwoosh.getInstance.registerForPushNotifications();
}
```

Onde:
- `__YOUR_APP_ID__` é o código do aplicativo do Painel de Controle da Pushwoosh.


### 3. Configuração Nativa do iOS

#### 3.1 Capabilities

Para habilitar as Notificações Push no seu projeto, você precisa adicionar certas capabilities.

Na seção Signing & Capabilities, adicione as seguintes capabilities:
- `Push Notifications`
- `Background Modes`. Após adicionar esta capability, marque a caixa para `Remote notifications`.

Se você pretende usar Notificações Sensíveis ao Tempo (iOS 15+), adicione também a capability `Time Sensitive Notifications`.

#### 3.2 Info.plist

No seu `Runner/Info.plist`, defina a chave `__PUSHWOOSH_DEVICE_API_TOKEN__` para o [Token da API do Dispositivo Pushwoosh](/pt/developer/api-reference/api-access-token/#device-api-token):
```swift title="info.plist"
<key>Pushwoosh_API_TOKEN</key>
<string>__PUSHWOOSH_DEVICE_API_TOKEN__</string>
```

#### 3.3 Rastreamento de entrega de mensagens

Você deve adicionar um target de Notification Service Extension ao seu projeto. Isso é essencial para o rastreamento preciso da entrega e para recursos como Rich Media no iOS.

Siga os [passos do guia nativo](/pt/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#4-message-delivery-tracking) para adicionar o target da extensão e o código Pushwoosh necessário dentro dele.

Para garantir que a Notification Service Extension esteja devidamente integrada ao seu projeto Flutter, você precisa usar a seguinte configuração de Podfile:

```ruby title="Podfile"
target 'NotificationServiceExtension' do
  use_frameworks!
  use_modular_headers!

  pod 'PushwooshXCFramework'

  inherit! :search_paths
end
```

#### 3.4 Instalando dependências para o projeto Flutter iOS

Para instalar as dependências do projeto Flutter iOS, execute o seguinte comando:

```bash
flutter run
```

ou navegue até a pasta ```ios``` no terminal e execute:

```bash
pod install --repo-update
```

### 4. Configuração Nativa do Android

#### 4.1 Instalar dependências

Certifique-se de que as dependências e plugins necessários sejam adicionados aos seus scripts Gradle:

Adicione o plugin Google Services Gradle às dependências do seu `build.gradle` de nível de projeto:

```groovy title="android/build.gradle"
buildscript {
  dependencies {
    classpath 'com.google.gms:google-services:4.3.15'
  }
}
```

Aplique o plugin no seu arquivo `build.gradle` de nível de aplicativo:

```groovy title="app/build.gradle"
apply plugin: 'com.google.gms.google-services'
```

#### 4.2 Adicionar arquivo de configuração do Firebase

Coloque o arquivo `google-services.json` na pasta `android/app` no diretório do seu projeto.

#### 4.3 Adicionar metadados da Pushwoosh

No seu `main/AndroidManifest.xml`, adicione o [Token da API do Dispositivo Pushwoosh](/pt/developer/api-reference/api-access-token/#device-api-token) dentro da tag `<application>`:

```xml title="AndroidManifest.xml"
<meta-data android:name="com.pushwoosh.apitoken" android:value="__YOUR_DEVICE_API_TOKEN__" />
```

> **Importante:** Certifique-se de dar ao token acesso ao aplicativo correto no seu Painel de Controle da Pushwoosh. [Saiba mais](/pt/developer/api-reference/api-access-token/#edit-token)

### 5. Executar o Projeto

1. Compile e execute o projeto.
2. Vá para o Painel de Controle da Pushwoosh e [envie uma notificação push](/pt/product/messaging-channels/push-notifications/send-push-notifications/one-time-push).
3. Você deve ver a notificação no aplicativo.

## Integração estendida

Neste estágio, você já integrou o SDK e pode enviar e receber notificações push. Agora, vamos explorar a funcionalidade principal

### Listeners de eventos de notificação push

No SDK da Pushwoosh, existem dois listeners de eventos, projetados para lidar com notificações push:

- O evento `onPushReceived` é acionado quando uma notificação push é recebida
- O evento `onPushAccepted` é acionado quando um usuário abre uma notificação

Você deve configurar esses listeners de eventos logo após a inicialização do SDK no início do aplicativo:

```dart
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

class PushwooshNotificationHandler {
  void setupPushListeners(Pushwoosh pushwoosh) {

    pushwoosh.onPushReceived.listen((event) {
      print("Push received: ${event.pushwooshMessage.payload}");
    });

    pushwoosh.onPushAccepted.listen((event) {
      print("Push accepted: ${event.pushwooshMessage.payload}");
    });
    
  }
}
```

### Configuração do usuário

Ao focar no comportamento e nas preferências individuais do usuário, você pode entregar conteúdo personalizado, levando a um aumento da satisfação e lealdade do usuário

```dart
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

class Registration {
  void afterUserLogin(User user) {
  
    // Definir ID do usuário
    Pushwoosh().setUserId(user.getId());
    
    // Definir e-mail do usuário
    Pushwoosh().setEmail(user.getEmail());

    // Registrar número de SMS
    // Os números de SMS e WhatsApp devem estar no formato E.164 (ex: "+1234567890") e ser válidos
    Pushwoosh().registerSmsNumber(user.getSmsNumber());

    // Registrar número do WhatsApp
    Pushwoosh().registerWhatsappNumber(user.getWhatsappNumber());
    
    // Definindo informações adicionais do usuário como tags para a Pushwoosh
    Pushwoosh().setTags({
      "age": user.getAge(),
      "name": user.getName(),
      "last_login": user.getLastLoginDate()
    });
  }
}
```

### Tags

Tags são pares de chave-valor atribuídos a usuários ou dispositivos, permitindo a segmentação com base em atributos como preferências ou comportamento, possibilitando o envio de mensagens direcionadas.

```dart
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

class UpdateUser {
  void afterUserUpdateProfile(User user) {

    // Definir lista de categorias favoritas
    Pushwoosh().setTags({
      "favorite_categories": user.getFavoriteCategoriesList()
    });
    
    // Definir informações de pagamento
    Pushwoosh().setTags({
      "is_subscribed": user.isSubscribed(),
      "payment_status": user.getPaymentStatus(),
      "billing_address": user.getBillingAddress()
    });
  }
}
```

### Eventos

Eventos são ações ou ocorrências específicas do usuário dentro do aplicativo que podem ser rastreadas para analisar o comportamento e acionar mensagens ou ações correspondentes

```dart
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

class Registration {

  // Rastrear evento de login
  void afterUserLogin(User user) {
    Pushwoosh().postEvent("login", {
      "name": user.getName(),
      "last_login": user.getLastLoginDate()
    });
  }

  void afterUserPurchase(Product product) {

  // Rastrear evento de compra
  Pushwoosh().postEvent("purchase", {
    "product_id": product.getId(),
    "product_name": product.getName(),
    "price": product.getPrice(),
    "quantity": product.getQuantity()
  });
 }
}
```

## Usando ProGuard

<Aside type="note">
Note que o comando `flutter build apk` ofusca seu código por padrão.
</Aside>

Assim, você pode receber esta exceção:

```java
java.lang.IllegalStateException: Could not find class for name: com.pushwoosh.plugin.PushwooshNotificationServiceExtension
```

Existem duas soluções neste caso:

1. Use o comando `flutter build apk --no-shrink` para compilar seu código sem ofuscação.
2. Ou você pode habilitar manualmente o ProGuard e adicionar as regras necessárias.

Para habilitar o ProGuard para o seu projeto, adicione as seguintes strings ao seu arquivo `build.gradle`:

```java title="build.gradle"
buildTypes {
        release {
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            signingConfig signingConfigs.debug
        }
    }
```

Em seguida, adicione as seguintes regras ao `android/app/proguard-rules.pro`

```java title="proguard-rules.pro"
#Pushwoosh Flutter
-keep class com.pushwoosh.plugin.PushwooshPlugin { *; }
-keep class com.pushwoosh.plugin.PushwooshNotificationServiceExtension { *; }
```


## Solução de problemas

Se você encontrar algum problema durante o processo de integração, consulte a seção de [suporte e comunidade](/pt/developer/pushwoosh-sdk/support-and-community).