Mobil SDK-nı Flutter tətbiqinə qoşmaq
Son yeniləmə: 9 oktyabr 2026 · 9 dəq oxunur
clomni_flutter plugin-i native Android və iOS SDK-larının üstündədir, ekranlar native ekranlardır.
Addımlar
-
1
Tələblər
- Flutter 3.16 və ya daha yeni.
- iOS 15, Android API 24.
- App ID və hər iki API açarı (
android_…,ios_…). - Səsli mesaj üçün (SDK 1.0.2-dən) Android tətbiqinin manifestində
RECORD_AUDIOelan olunmalıdır, yoxsa mikrofon düyməsi görünmür. Kamera üçün icazə lazım deyil.
-
2
Quraşdırma
flutter pub add clomni_flutter
iOS SDK Swift package-dir:
- Swift Package Manager ilə plugin SDK-nı özü götürür. İndiki Flutter-də o standart olaraq açıqdır. Flutter 3.24 və sonrakı versiyada söndürülübsə,
flutter config --enable-swift-package-managerilə açılır. - CocoaPods ilə bu sətri
ios/Podfile-a,target 'Runner'içinə yazın vəpod installişlədin. Sətir olmasapod install«clomni_flutter: the iOS SDK is not on CocoaPods trunk» yazıb dayanır.
pod 'ClomniMessenger', :git => 'https://github.com/clomni/clomni-mobile-sdk.git', :tag => '1.0.4'
ios/Runner/Info.plist-ə şəkil icazəsi mətnlərini (NSPhotoLibraryUsageDescription,NSCameraUsageDescription, SDK 1.0.2-dənNSMicrophoneUsageDescription) əlavə edin.Android-də
MainActivityFlutterActivityyox,FlutterFragmentActivity-dən törəməlidir. Yoxsa Messenger açılanda tətbiq çökür və üzən düymə görünmür:// android/app/src/main/kotlin/com/example/app/MainActivity.kt package com.example.app import io.flutter.embedding.android.FlutterFragmentActivity class MainActivity : FlutterFragmentActivity()
- Swift Package Manager ilə plugin SDK-nı özü götürür. İndiki Flutter-də o standart olaraq açıqdır. Flutter 3.24 və sonrakı versiyada söndürülübsə,
-
3
SDK-nı başladın
import 'dart:io' show Platform; import 'package:clomni_flutter/clomni_flutter.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Clomni.initialize('app_…', Platform.isIOS ? 'ios_…' : 'android_…'); if (kDebugMode) await Clomni.setLogLevel(ClomniLogLevel.debug); runApp(const App()); } -
4
İstifadəçi və Messenger
await Clomni.loginUser( const ClomniUser(userId: '12345', email: '[email protected]', name: 'Aysel'), userHash: hashFromYourServer, ); await Clomni.updateUser(language: 'az', customAttributes: {'plan': 'premium'}); // Together with your app's own logout: await Clomni.logout();
class SupportTile extends StatelessWidget { const SupportTile({super.key}); @override Widget build(BuildContext context) { return StreamBuilder<int>( stream: Clomni.unreadCountStream, // the current count at once, then every change builder: (context, snapshot) { final unread = snapshot.data ?? 0; return ListTile( title: const Text('Support'), trailing: unread > 0 ? Badge(label: Text('$unread')) : null, onTap: () => Clomni.present(source: 'profile_support'), ); }, ); } }Digər çağırışlar:
presentNewConversation(source: …),presentConversation(id),dismiss(),setLauncherVisible(true),setBottomPadding(72). Hadisələr stream-dir:onMessengerOpened,onMessengerClosed,onConversationStarted,onFlowCompleted.pubspec.yaml-dakı şriftlər native ekranlara çatmır.setTypeface-ə iOS-daUIAppFonts-dakı şriftin ailə adını, Android-dəres/fontresursunun adını verin:await Clomni.setTypeface(Platform.isIOS ? 'Montserrat' : 'montserrat');.Tətbiq hər açılanda, istifadəçi daxil olubsa,
loginUser-i yenidən çağırın, istifadəçi təzə daxil olmuş kimi. Eyni istifadəçi üçün SDK saxlanmış sessiyanı işlədir. -
5
Flow-lar, hadisələr, linklər və görünüş
Flow-u tətbiqdən başlatmaq və Messenger-in hadisələrini dinləmək:
await Clomni.startFlow('ride_problem', data: {'ride_id': 'R-1923'}, openMessenger: true, source: 'ride_screen'); final subscriptions = [ Clomni.onMessengerOpened.listen((source) => debugPrint('opened from $source')), Clomni.onMessengerClosed.listen((_) => debugPrint('closed')), Clomni.onConversationStarted.listen((id) => debugPrint('conversation $id')), Clomni.onFlowCompleted.listen((flowId) => debugPrint('flow $flowId')), ]; // later: for (final s in subscriptions) { s.cancel(); }Flow paneldə eyni adlı «Tətbiq hadisəsi» trigger-i ilə qurulmalı və dərc olunmalıdır. Data JSON olmalıdır.
Linklər, Messenger-in dili, səslər və tətbiqin öz rəngi:
import 'package:url_launcher/url_launcher.dart'; await Clomni.onLink((url) => launchUrl(Uri.parse(url))); // or your own router; null: the system opens links await Clomni.setLanguage('en'); // 'az', 'en', 'ru'; null follows the phone await Clomni.setSoundsEnabled(false); await Clomni.setTheme(primaryColor: '#0A66C2', typeface: 'Montserrat', mode: ClomniThemeMode.dark);Messenger-in dilini
setLanguagedəyişir.updateUser(language: …)isə istifadəçinin profilindəki dili yazır. Seçilən dil paneldə açıq olmalıdır, yoxsa telefonun dili, o da açıq deyilsə panelin əsas dili işləyir. Rəng#RRGGBBformatında olmalıdır. Paneldəki dəyərlər yalnız tətbiq öz dəyərini vermədikdə işləyir. -
6
Push: Android
Açarları əvvəlcə panelə yükləyin («Mobil SDK push açarları»). Firebase-i FlutterFire ilə qurun (
flutterfire configure) vəandroid/app/src/main/AndroidManifest.xml-də<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />elan edin.import 'dart:io' show Platform; import 'package:clomni_flutter/clomni_flutter.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; // Clomni data messages while the app is in the background or closed: the SDK shows the notification. @pragma('vm:entry-point') Future<void> onBackgroundMessage(RemoteMessage message) async { await Clomni.handlePush(message.data); } Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); FirebaseMessaging.onBackgroundMessage(onBackgroundMessage); await Clomni.initialize('app_…', Platform.isIOS ? 'ios_…' : 'android_…'); runApp(const App()); } Future<void> setUpAndroidPush() async { final messaging = FirebaseMessaging.instance; await messaging.requestPermission(); // Android 13+: the system permission dialog final token = await messaging.getToken(); if (token != null) await Clomni.setDeviceToken(token); messaging.onTokenRefresh.listen(Clomni.setDeviceToken); // Messages while the app is open. FirebaseMessaging.onMessage.listen((message) async { if (!await Clomni.handlePush(message.data)) { // your app's own push } }); await Clomni.setNotificationIcon('ic_notification'); // android/app/src/main/res/drawable/ic_notification.png }setUpAndroidPush()-u Android-də uyğun anda çağırın, məsələn login-dən sonra. -
7
Push: iOS
Clomni iOS push-larını Firebase-dən keçirmədən APNs-ə göndərir.
firebase_messagingClomni bildirişinə toxunuşu görmür, ona görə toxunuşu Runner-in native kodunda tutun:- Xcode-da (
ios/Runner.xcworkspace): Runner › Signing & Capabilities › + Capability › Push Notifications. - Runner-in kodu
ClomniMessenger-i import edir. CocoaPods ilə yuxarıdakı Podfile sətri bəsdir. Swift Package Manager ilə paketi Runner hədəfinə də əlavə edin: File › Add Package Dependencies,https://github.com/clomni/clomni-mobile-sdk.git, məhsulClomniMessenger, hədəf Runner. - Bu faylı Runner-ə əlavə edin:
// ios/Runner/ClomniNotifications.swift import ClomniMessenger import UserNotifications /// Clomni pushes: hidden while the Messenger is open, and a tap opens the conversation. final class ClomniNotifications: NSObject, UNUserNotificationCenterDelegate { static let shared = ClomniNotifications() func userNotificationCenter( _ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void ) { let show = Clomni.shouldShowForeground(notification.request.content.userInfo) completionHandler(show ? [.banner, .list, .sound] : []) } func userNotificationCenter( _ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void ) { _ = Clomni.handlePush(response.notification.request.content.userInfo) completionHandler() } }AppDelegate.swift-də onu delegate edin, `super.application(...)`-dan əvvəl:
// ios/Runner/AppDelegate.swift import Flutter import UIKit import UserNotifications @main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { UNUserNotificationCenter.current().delegate = ClomniNotifications.shared GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }- APNs tokenini Dart-dan verin:
if (Platform.isIOS) { await FirebaseMessaging.instance.requestPermission(); final apnsToken = await FirebaseMessaging.instance.getAPNSToken(); // hex if (apnsToken != null) await Clomni.setDeviceToken(apnsToken); }iOS-da Firebase yoxdursa,
AppDelegate-dədidRegisterForRemoteNotificationsWithDeviceToken-i override edin:Clomni.setDeviceToken(deviceToken), sonrasuper. - Xcode-da (
-
8
Problemlər
pod installdayanır vəpod 'ClomniMessenger'sətrini çap edir: sətritarget 'Runner'içinə yazın, ya da Swift Package Manager-i açın.- Android: Messenger açılanda çökür və ya üzən düymə görünmür:
MainActivityFlutterFragmentActivity-dən törəməlidir. - Android-də tətbiq bağlı olanda bildiriş gəlmir:
onBackgroundMessage-irunApp-dan əvvəl, top-level funksiya ilə qeydə alın. - iOS:
No such module 'ClomniMessenger': paketi və ya pod-u Runner hədəfinə əlavə edin (2-ci addım). - iOS-da toxunanda yalnız tətbiq açılır: delegate yoxdur və ya
super.application(...)-dan sonra təyin olunur.
Dart xətaları Flutter logunda
[Clomni]ilə başlayır, native loglar logcat-da (Clomni) və Xcode konsolundadır. -
9
Tam təlimat
- PDF: Clomni Mobile SDK təlimatı, Azərbaycan, ingilis və rus dilində.
- Onlayn: Flutter.
- Paneldə: kanalın ayarlar sütununda «Təlimat».