Appearance
Установка Flutter SDK
Шаг 1. Установка SDK
Добавьте пакет в проект:
flutter pub add rees46_sdkИли вручную в pubspec.yaml:
dependencies:
rees46_sdk: ^0.2.0Flutter 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:
| Свойство | Значение по умолчанию | Назначение |
|---|---|---|
shopId | API-ключ проекта | |
stream | Стрим | |
apiDomain | api.rees46.ru | Кастомный домен REES46 API в случае on-premise |
autoSendPushToken | true | Булевый флаг для автоматического запроса mobile push токена |
needReInitialization | false | Флаг необходимости провести переинициализацию 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. |