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. 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_AUDIO elan olunmalıdır, yoxsa mikrofon düyməsi görünmür. Kamera üçün icazə lazım deyil.
  2. 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-manager ilə açılır.
    • CocoaPods ilə bu sətri ios/Podfile-a, target 'Runner' içinə yazın və pod install işlədin. Sətir olmasa pod 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ən NSMicrophoneUsageDescription) əlavə edin.

    Android-də MainActivity FlutterActivity yox, 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()
  3. 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. 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-da UIAppFonts-dakı şriftin ailə adını, Android-də res/font resursunun 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. 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 setLanguage də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 #RRGGBB formatında olmalıdır. Paneldəki dəyərlər yalnız tətbiq öz dəyərini vermədikdə işləyir.

  6. 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. 7

    Push: iOS

    Clomni iOS push-larını Firebase-dən keçirmədən APNs-ə göndərir. firebase_messaging Clomni bildirişinə toxunuşu görmür, ona görə toxunuşu Runner-in native kodunda tutun:

    1. Xcode-da (ios/Runner.xcworkspace): Runner › Signing & Capabilities › + Capability › Push Notifications.
    2. 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əhsul ClomniMessenger, hədəf Runner.
    3. 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()
        }
    }
    1. 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)
      }
    }
    1. 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), sonra super.

  8. 8

    Problemlər

    • pod install dayanır və pod 'ClomniMessenger' sətrini çap edir: sətri target '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: MainActivity FlutterFragmentActivity-dən törəməlidir.
    • Android-də tətbiq bağlı olanda bildiriş gəlmir: onBackgroundMessage-i runApp-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. 9

    Tam təlimat

Sənəd