Skip to content

Установка Flutter SDK

Шаг 1. Установка SDK

Добавьте пакет в проект:

flutter pub add rees46_sdk

Или вручную в pubspec.yaml:

dependencies:
  rees46_sdk: ^0.2.0

Flutter SDK представляет собой тонкую обёртку над нативными Android и iOS SDK: хранилище, сессия, идентификаторы и доставка пушей работают на нативной стороне. Нативные зависимости подтягиваются вместе с пакетом, добавлять их отдельно не нужно.

Android

Единственное требование к приложению это minSdk 24. Актуальные версии Flutter используют такое значение по умолчанию, поэтому в свежем проекте менять ничего не нужно. Задайте его явно, только если в android/app/build.gradle.kts прописано меньшее значение:

android {
    defaultConfig {
        minSdk = 24
    }
}

iOS

Для мобильных пушей включите в Xcode у таргета Runner возможности Push Notifications и Background Modes с галкой Remote notifications, а ключ APNs загрузите в личный кабинет REES46.

Шаг 2. Запуск сессии

Инициализируйте SDK один раз и как можно раньше, обычно в main() до runApp. Минимально необходимый режим старта сессии:

dart
import 'package:flutter/widgets.dart';
import 'package:rees46_sdk/rees46_sdk.dart';

late final PersonalizationSdk sdk;

void main() {
    WidgetsFlutterBinding.ensureInitialized();

    sdk = Rees46.initialize(
        const Rees46Config(shopId: 'YOUR_SHOP_ID'),
    );

    runApp(const MyApp());
}

Точка входа в SDK это класс Rees46. Метод Rees46.initialize возвращает хэндл синхронно и запускает нативную инициализацию в фоне. Вызовы, сделанные сразу после него, ставятся в очередь на нативной стороне до готовности сессии, поэтому хэндлом можно пользоваться сразу.

Пример со всеми возможными параметрами:

dart
sdk = Rees46.initialize(
    const Rees46Config(
        shopId: 'YOUR_SHOP_ID',
        apiDomain: 'api.rees46.ru',
        stream: 'android',
        autoSendPushToken: true,
        needReInitialization: false,
    ),
);

Дополнительные свойства для расширенного управления SDK:

СвойствоЗначение по умолчаниюНазначение
shopIdAPI-ключ проекта
streamСтрим
apiDomainapi.rees46.ruКастомный домен REES46 API в случае on-premise
autoSendPushTokentrueБулевый флаг для автоматического запроса mobile push токена
needReInitializationfalseФлаг необходимости провести переинициализацию SDK и запрос новых did и sid с сервера. Востребовано, если в одном приложении есть интеграции с несколькими личными кабинетами REES46

Пример:

dart
final sdk = Rees46.initialize(
    Rees46Config(
        shopId: AppEnvironments.shopId,
        apiDomain: AppEnvironments.apiDomain,
        needReInitialization: true,
    ),
);

Проверить, что сессия поднялась, можно так:

dart
final sid = await sdk.getSid();   // идентификатор сессии
final did = await sdk.getDid();   // идентификатор устройства, выданный REES46

Непустой did означает, что нативный SDK завершил обмен с API.

Несколько проектов в одном приложении

Одно приложение может работать с несколькими проектами одновременно, например когда для каждой страны используется свой ключ API. Каждый проект получает собственный нативный инстанс с изолированным хранилищем, сессией и did, поэтому повторная инициализация из шага 2 в этом сценарии не нужна.

Проекты можно зарегистрировать заранее и инициализировать при первом обращении:

dart
Rees46.registerShops(const [
    Rees46Config(shopId: 'SHOP_ID_A'),
    Rees46Config(shopId: 'SHOP_ID_B'),
]);

final shopA = Rees46.getInstance('SHOP_ID_A');

Передайте eagerInit: true, чтобы проинициализировать все магазины сразу.

Методы фасада:

dart
// Инициализирует магазин немедленно и возвращает хэндл.
Rees46.initialize(config)

// Регистрирует магазины, инициализация происходит при первом обращении.
Rees46.registerShops(configs)
    
// Возвращает хэндл магазина.
Rees46.getInstance([shopId])
    
// Проверяет, поднят ли инстанс магазина.
Rees46.isInitialized([shopId])

Обращение к инстансу

Вызов Rees46.getInstance() без аргумента работает, только пока зарегистрирован ровно один проект. Если проектов несколько, метод выбросит AmbiguousShopException, поэтому обращайтесь к инстансам явно, по shopId. Для незарегистрированного идентификатора выбрасывается UnknownShopIdException.

Обработка ответов методов

Все методы вызываются на хэндле, который вернула инициализация.

Каждый вызов уходит в тот проект, к которому привязан хэндл. Идентификаторы did и sid SDK подставляет сам, передавать их не нужно.

Все методы асинхронные и возвращают Future. Ошибки приходят как PlatformException с кодами:

Код ошибкиОписание
bad_argsНе заполнен обязательный аргумент, например пустой код события или пустой orderId.
track_event_failed, track_purchase_failed, set_profile_failedОшибка на нативной стороне или на стороне API. Текст ответа сервера лежит в поле message.