# Руководство по базовой интеграции Flutter SDK

В этом разделе содержится информация о том, как интегрировать Pushwoosh Flutter SDK в ваше приложение.

## Предварительные требования

Для интеграции Pushwoosh Flutter SDK в ваше приложение вам понадобится следующее:

<Aside type="note" title="Требования">
 - [Аккаунт Pushwoosh](https://sso.pushwoosh.com/login).
 - [Проект Pushwoosh](/ru/product/first-steps/start-with-your-project/create-your-project), настроенный в вашем аккаунте.
 - **Для интеграции с iOS:**
    - Платформа iOS, настроенная для отправки push-уведомлений. Мы рекомендуем использовать [конфигурацию на основе токенов аутентификации](/ru/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/) как самый простой подход.
    - Установите Gateway на `Sandbox` для отправки push-уведомлений в симулятор.
 - **Для интеграции с Android:**
    - [Настроенная Android-платформа](/ru/developer/first-steps/connect-messaging-services/android-configuration/android-firebase-configuration)
    - Файл `google-services.json` и `package name` из вашего проекта Firebase.
    - Проект Firebase, подключенный к вашему Android-приложению. При необходимости следуйте [руководству по настройке Firebase](https://firebase.google.com/docs/android/setup#manually_add_firebase).
 - Ваш `Pushwoosh Application Code` и [Pushwoosh Device API Token](/ru/developer/api-reference/api-access-token/#device-api-token) из панели управления Pushwoosh для вашего приложения.
</Aside>

## Шаги интеграции

### 1. Добавьте зависимость Pushwoosh Flutter SDK

Добавьте пакет `pushwoosh_flutter` в ваш файл `pubspec.yaml`:

```yaml title="pubspec.yaml"
dependencies:
  flutter:
    sdk: flutter
  # Используйте последнюю версию с https://pub.dev/packages/pushwoosh_flutter
  pushwoosh_flutter: ^[LATEST_VERSION]
```
Проверьте [последнюю версию](https://pub.dev/packages/pushwoosh_flutter) на pub.dev.

Затем выполните следующую команду в корневом каталоге вашего проекта, чтобы установить зависимость:

```bash
flutter pub get
```

Дважды проверьте, что пакет установлен корректно:
```bash
flutter pub deps | grep pushwoosh_flutter

# Пример вывода:
# ❯ flutter pub deps | grep pushwoosh_flutter
# └── pushwoosh_flutter 2.3.11
```

### 2. Инициализация Flutter SDK

В корневом компоненте вашего файла `main.dart`:
- Импортируйте пакет `pushwoosh_flutter`.
- Инициализируйте Pushwoosh SDK.
- Вызовите `registerForPushNotifications()` в вашей логике инициализации для регистрации на получение 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();
}
```

Где:
- `__YOUR_APP_ID__` — это код приложения из панели управления Pushwoosh.


### 3. Нативная настройка для iOS

#### 3.1 Capabilities

Чтобы включить Push-уведомления в вашем проекте, необходимо добавить определенные capabilities.

В разделе Signing & Capabilities добавьте следующие capabilities:
- `Push Notifications`
- `Background Modes`. После добавления этой capability отметьте флажок `Remote notifications`.

Если вы планируете использовать Time Sensitive Notifications (iOS 15+), также добавьте capability `Time Sensitive Notifications`.

#### 3.2 Info.plist

В вашем `Runner/Info.plist` установите ключ `__PUSHWOOSH_DEVICE_API_TOKEN__` в значение [Pushwoosh Device API Token](/ru/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 Отслеживание доставки сообщений

Вы должны добавить таргет Notification Service Extension в ваш проект. Это необходимо для точного отслеживания доставки и таких функций, как Rich Media на iOS.

Следуйте [шагам из нативного руководства](/ru/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#4-message-delivery-tracking), чтобы добавить таргет расширения и необходимый код Pushwoosh в него.

Чтобы убедиться, что Notification Service Extension правильно интегрирован в ваш Flutter-проект, вам необходимо использовать следующую конфигурацию Podfile:

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

  pod 'PushwooshXCFramework'

  inherit! :search_paths
end
```

#### 3.4 Установка зависимостей для iOS Flutter-проекта

Чтобы установить зависимости для iOS Flutter-проекта, выполните следующую команду:

```bash
flutter run
```

или перейдите в папку ```ios``` в терминале и выполните:

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

### 4. Нативная настройка для Android

#### 4.1 Установка зависимостей

Убедитесь, что необходимые зависимости и плагины добавлены в ваши Gradle-скрипты:

Добавьте плагин Google Services Gradle в зависимости вашего `build.gradle` на уровне проекта:

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

Примените плагин в вашем файле `build.gradle` на уровне приложения:

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

#### 4.2 Добавьте конфигурационный файл Firebase

Поместите файл `google-services.json` в папку `android/app` в каталоге вашего проекта.

#### 4.3 Добавьте метаданные Pushwoosh

В вашем `main/AndroidManifest.xml` добавьте [Pushwoosh Device API Token](/ru/developer/api-reference/api-access-token/#device-api-token) внутри тега `<application>`:

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

> **Важно:** Убедитесь, что вы предоставили токену доступ к нужному приложению в вашей панели управления Pushwoosh. [Узнать больше](/ru/developer/api-reference/api-access-token/#edit-token)

### 5. Запустите проект

1. Соберите и запустите проект.
2. Перейдите в панель управления Pushwoosh и [отправьте push-уведомление](/ru/product/messaging-channels/push-notifications/send-push-notifications/one-time-push).
3. Вы должны увидеть уведомление в приложении.

## Расширенная интеграция

На этом этапе вы уже интегрировали SDK и можете отправлять и получать push-уведомления. Теперь давайте рассмотрим основную функциональность.

### Слушатели событий push-уведомлений

В Pushwoosh SDK есть два слушателя событий, предназначенных для обработки push-уведомлений:

- событие `onPushReceived` срабатывает, когда получено push-уведомление
- событие `onPushAccepted` срабатывает, когда пользователь открывает уведомление

Вы должны настроить этих слушателей событий сразу после инициализации SDK при запуске приложения:

```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}");
    });
    
  }
}
```

### Конфигурация пользователя

Сосредоточившись на поведении и предпочтениях отдельных пользователей, вы можете предоставлять персонализированный контент, что приведет к повышению удовлетворенности и лояльности пользователей.

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

class Registration {
  void afterUserLogin(User user) {
  
    // Установить User ID
    Pushwoosh().setUserId(user.getId());
    
    // Установить email пользователя
    Pushwoosh().setEmail(user.getEmail());

    // Зарегистрировать номер SMS
    // Номера SMS и WhatsApp должны быть в формате E.164 (например, "+1234567890") и быть действительными
    Pushwoosh().registerSmsNumber(user.getSmsNumber());

    // Зарегистрировать номер WhatsApp
    Pushwoosh().registerWhatsappNumber(user.getWhatsappNumber());
    
    // Установка дополнительной информации о пользователе в виде тегов для Pushwoosh
    Pushwoosh().setTags({
      "age": user.getAge(),
      "name": user.getName(),
      "last_login": user.getLastLoginDate()
    });
  }
}
```

### Теги

Теги — это пары «ключ-значение», назначаемые пользователям или устройствам, которые позволяют сегментировать аудиторию по таким атрибутам, как предпочтения или поведение, для целевых сообщений.

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

class UpdateUser {
  void afterUserUpdateProfile(User user) {

    // Установить список любимых категорий
    Pushwoosh().setTags({
      "favorite_categories": user.getFavoriteCategoriesList()
    });
    
    // Установить платежную информацию
    Pushwoosh().setTags({
      "is_subscribed": user.isSubscribed(),
      "payment_status": user.getPaymentStatus(),
      "billing_address": user.getBillingAddress()
    });
  }
}
```

### События

События — это определенные действия пользователя или происшествия в приложении, которые можно отслеживать для анализа поведения и запуска соответствующих сообщений или действий.

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

class Registration {

  // Отследить событие входа
  void afterUserLogin(User user) {
    Pushwoosh().postEvent("login", {
      "name": user.getName(),
      "last_login": user.getLastLoginDate()
    });
  }

  void afterUserPurchase(Product product) {

  // Отследить событие покупки
  Pushwoosh().postEvent("purchase", {
    "product_id": product.getId(),
    "product_name": product.getName(),
    "price": product.getPrice(),
    "quantity": product.getQuantity()
  });
 }
}
```

## Использование ProGuard

<Aside type="note">
Обратите внимание, что команда `flutter build apk` по умолчанию обфусцирует ваш код.
</Aside>

Таким образом, вы можете получить это исключение:

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

В этом случае есть два решения:

1. Используйте команду `flutter build apk --no-shrink` для компиляции вашего кода без обфускации.
2. Или вы можете вручную включить ProGuard и добавить необходимые правила.

Чтобы включить ProGuard для вашего проекта, добавьте следующие строки в ваш файл `build.gradle`:

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

            signingConfig signingConfigs.debug
        }
    }
```

Затем добавьте следующие правила в `android/app/proguard-rules.pro`

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


## Устранение неполадок

Если у вас возникнут какие-либо проблемы в процессе интеграции, обратитесь к разделу [поддержки и сообщества](/ru/developer/pushwoosh-sdk/support-and-community).