arkadia_sdk 1.2.0
arkadia_sdk: ^1.2.0 copied to clipboard
SDK officiel de l'API Arkadia pour Flutter et Dart. Licences (achat, activation, contrôle hors ligne signé) et activité de votre app, avec file hors ligne.
arkadia_sdk #
SDK officiel de l'API Arkadia pour Flutter : envoyez l'activité et les ventes de votre application, lisez votre quota et vos statistiques.
- File d'attente hors ligne, renvois automatiques sans doublon (clé d'idempotence)
- Envoi automatique quand l'app passe en arrière-plan
- Android, iOS, web, desktop
Installation #
flutter pub add arkadia_sdk
Démarrage #
import 'package:arkadia_sdk/arkadia_sdk.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await ArkadiaClient.init(
apiKey: 'ark_live_…', // onglet « API » de votre espace Arkadia
appCode: 'APP-XXXX-XXXX',
platform: defaultTargetPlatform.name,
appVersion: '2.3.0',
debug: kDebugMode,
);
runApp(const MyApp());
}
ArkadiaClient.screenView('dashboard', previousScreen: 'login');
ArkadiaClient.sessionStart(userId: hashedUserId);
ArkadiaClient.sessionEnd(342);
ArkadiaClient.featureUsed('export_pdf', metadata: {'format': 'a4'});
ArkadiaClient.crash('StateError', e.toString(), stackTrace: st.toString());
// Ventes — montants en centimes (9 900 XOF = 990000)
ArkadiaClient.subscriptionStarted('pro', 990000, 'monthly', userId: hashedUserId);
ArkadiaClient.purchaseCompleted('module-crm', 'Module CRM', 250000);
ArkadiaClient.trialStarted('pro', 14);
// Event générique
ArkadiaClient.track('app.onboarding_completed', properties: {'durationSeconds': 120});
Les events partent toutes les 30 secondes, dès qu'un lot est plein, quand l'app passe en arrière-plan, ou avec await ArkadiaClient.flush(). Les crashs partent immédiatement. Pour userId, envoyez un identifiant anonymisé.
Les raccourcis de vente (subscriptionStarted, purchaseCompleted…) sont de la télémétrie : ils alimentent vos statistiques mais ne sont pas des ventes. Une vente réelle passe par ArkadiaClient.licenses.checkout().
Licences #
Arkadia vend vos licences (paiement GeniusPay), émet les clés et les contrôle. Toute app éditée par Arkadia doit vérifier sa licence au démarrage.
final licence = await ArkadiaClient.licenses.validate();
if (!licence.valid) showPaywall(licence.status); // none, expired, revoked, offline_expired…
validate() interroge Arkadia au plus une fois par heure (force: true pour forcer). Hors ligne, il vérifie le dernier jeton signé par Arkadia (7 jours au plus, jamais au-delà de la période de grâce).
// Achat
final offres = await ArkadiaClient.licenses.products();
final vente = await ArkadiaClient.licenses.checkout(
productId: offres.first['productId'] as String,
buyer: {'name': 'Awa Koné', 'email': 'awa@exemple.ci', 'phone': '+2250700000000'},
successUrl: 'https://mon-app.ci/paiement/ok',
errorUrl: 'https://mon-app.ci/paiement/erreur',
);
await launchUrl(Uri.parse(vente['checkoutUrl'] as String)); // page GeniusPay
// Au retour dans l'app :
final result = await ArkadiaClient.licenses.completeCheckout();
if (result.license?.valid ?? false) unlockApp();
// Clé saisie par l'utilisateur, essai, renouvellement
await ArkadiaClient.licenses.activate(cleSaisie);
await ArkadiaClient.licenses.startTrial(productId: 'APP-…-essai', email: email);
await ArkadiaClient.licenses.renew(buyer: acheteur, successUrl: ok, errorUrl: ko);
Les erreurs de l'API (device_limit_reached, license_not_found, trial_already_used…) sont levées en ArkadiaApiException.
Quota et statistiques #
final status = await ArkadiaClient.status();
final quota = status['quota'] as Map<String, dynamic>;
print('${quota['used_this_month']} / ${quota['limit']} events ce mois');
final stats = await ArkadiaClient.analytics(
from: DateTime.utc(2026, 9, 1),
to: DateTime.utc(2026, 9, 30),
);
Ces méthodes lèvent une ArkadiaApiException (statusCode, code, message) en cas d'erreur.
Webhooks #
Les webhooks se vérifient côté serveur. En Node.js, utilisez @arkadiadev/sdk/webhooks ; dans un autre langage, calculez HMAC-SHA256(secret, "<t>.<corps brut>") en hexadécimal et comparez-le à la valeur v1 de l'en-tête X-Arkadia-Signature: t=<t>,v1=<signature> (en refusant un t vieux de plus de 5 minutes).
Limites #
| Clé live | Clé test | |
|---|---|---|
| Events par requête | 50 | 20 |
| Events par minute | 300 | 60 |
Lectures (status, analytics) par minute |
60 | 30 |
Le SDK respecte automatiquement ces limites et l'en-tête Retry-After.