Mobil SDK-nı React Native və Expo tətbiqinə qoşmaq
Son yeniləmə: 9 oktyabr 2026 · 10 dəq oxunur
@clomni/react-native paketi native Android və iOS SDK-larının üstündədir, ekranlar native ekranlardır.
Addımlar
-
1
Tələblər
- React Native 0.75 və ya daha yeni (New Architecture üçün 0.76). Expo SDK 52 və ya daha yeni, development build ilə.
- iOS 15, Android 6.0 (API 23).
- 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
npm install @clomni/react-native cd ios && pod install
Qalanını autolinking edir. Android-də modul
ai.clomni:messenger-i Maven Central-dan gətirir. iOS-dapod installSDK-nı Swift package kimi əlavə edir (React Native-inspm_dependency-si), Xcode onu ilk build-də yükləyir.React Native 0.75-dən köhnədirsə,
pod install«@clomni/react-native needs React Native 0.75 or later» yazıb dayanır. React Native-i yeniləyin, ya da Podfile-a aşağıdakı sətri əlavə edin. Link zamanıClomniMessengersimvollarında xəta çıxırsa, ya da push-u native kodda bağlayırsınızsa da bu sətri əlavə edin:# ios/Podfile, in your app's target pod 'ClomniMessenger', :git => 'https://github.com/clomni/clomni-mobile-sdk.git', :tag => '1.0.4'
-
3
Expo
Expo Go native modulları yükləyə bilmir. Development build işlədin:
npx expo prebuild,npx expo run:iosvə yarun:android, ya da EAS build. Paketin config plugin-i native layihələrə lazım olanları yazır:// app.config.ts export default { // ... plugins: [ ['@clomni/react-native', { photoLibraryPermission: 'To send photos to support', // iOS cameraPermission: 'To take a photo and send it to support', // iOS push: true, // the default notificationIcon: './assets/notification-icon.png', // Android, white silhouette PNG }], ], };push: trueiOS-daaps-environmententitlement-ini vəremote-notificationbackground mode-u, Android-dəPOST_NOTIFICATIONSicazəsini əlavə edir. İkonclomni_notification_iconadlı drawable olur. Adi (Expo-suz) tətbiqdə iki şəkil icazəsi mətniniInfo.plist-ə özünüz yazın:NSPhotoLibraryUsageDescriptionvəNSCameraUsageDescription. -
4
SDK-nı başladın
Bir dəfə, komponentdən kənarda.
index.jsyaxşı yerdir, çünki push tətbiqi ekransız başlada bilər.// index.js import { AppRegistry, Platform } from 'react-native'; import Clomni from '@clomni/react-native'; import App from './App'; import { name as appName } from './app.json'; Clomni.initialize('app_…', Platform.OS === 'ios' ? 'ios_…' : 'android_…'); if (__DEV__) Clomni.setLogLevel('debug'); AppRegistry.registerComponent(appName, () => App);initialize-in üçüncü parametriregion-dur, standart dəyəri'eu'-dur. Hazırda yalnız'eu'var, onu yazmaq lazım deyil: başqa dəyər verilsə, SDK bunu loga yazır və'eu'işlədir. -
5
İstifadəçi və Messenger
Clomni.loginUser({ userId: '12345', email: '[email protected]', name: 'Aysel' }, hashFromYourServer); Clomni.updateUser({ language: 'az', customAttributes: { plan: 'premium' } }); // Together with your app's own logout: Clomni.logout();import { useEffect, useState } from 'react'; import { Pressable, Text } from 'react-native'; import Clomni from '@clomni/react-native'; export function SupportRow() { const [unread, setUnread] = useState(0); useEffect(() => { // The current count at once, then every change. const subscription = Clomni.addEventListener('unreadCountChanged', setUnread); return () => subscription.remove(); }, []); return ( <Pressable onPress={() => Clomni.present('profile_support')}> <Text>Support{unread > 0 ? ` (${unread})` : ''}</Text> </Pressable> ); }Digər çağırışlar:
presentNewConversation(source),presentConversation(id),dismiss(),setLauncherVisible(true),setBottomPadding(72). HadisələraddEventListenerilə:messengerOpened,messengerClosed,conversationStarted,flowCompleted. Native SDK-nın callback-lərini modul özü tutur, onları native kodda ayrıca təyin etməyin.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.Daxil olmamış istifadəçi üçün heç nə çağırmaq lazım deyil: Messenger açılanda anonim ziyarətçini özü yaradır.
Clomni.loginUnidentifiedUser()bunu əvvəlcədən edir. Ziyarətçilogout-a qədər bu cihazda eyni qalır,loginUserçağırılanda onun söhbətləri istifadəçiyə keçir. -
6
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:
Clomni.startFlow('ride_problem', { ride_id: 'R-1923' }, { openMessenger: true, source: 'ride_screen' }); const subscriptions = [ Clomni.addEventListener('messengerOpened', (source) => console.log('opened from', source)), Clomni.addEventListener('messengerClosed', () => console.log('closed')), Clomni.addEventListener('conversationStarted', (id) => console.log('conversation', id)), Clomni.addEventListener('flowCompleted', (flowId) => console.log('flow', flowId)), ]; // later: subscriptions.forEach((s) => s.remove());Flow paneldə eyni adlı «Tətbiq hadisəsi» trigger-i ilə qurulmalı və dərc olunmalıdır. Data JSON olmalıdır. Modul native SDK-nın hadisələrini özü idarə edir: onları tətbiqin native kodunda ayrıca təyin etməyin.
Linklər, dil, səslər və tətbiqin öz rəngi:
import { Linking } from 'react-native'; Clomni.onLink((url) => Linking.openURL(url)); // or your own router; null: the system opens links Clomni.setLanguage('en'); // 'az', 'en', 'ru'; null follows the phone Clomni.setSoundsEnabled(false); Clomni.setTheme({ primaryColor: '#0A66C2', typeface: 'Montserrat', mode: 'dark' });Şrift
fontFamilystillərində işlətdiyiniz ailə adıdır. iOS-da şrift tətbiqdə olmalı vəUIAppFontsaltında yazılmalıdır, Android-də React Native onuandroid/app/src/main/assets/fontsvə yares/fontqovluğunda tapır. Yalnız şrift üçün:Clomni.setTypeface('Montserrat'). Paneldəki dəyər yalnız tətbiq öz dəyərini vermədikdə işləyir. -
7
Push: Android
Açarları əvvəlcə panelə yükləyin («Mobil SDK push açarları»). Firebase-i
google-services.jsonvə Google services Gradle plugin-i ilə, React Native Firebase sənədindəki kimi qurun. Sonra:// index.js, next to initialize import messaging from '@react-native-firebase/messaging'; // Clomni data messages while the app is in the background or closed: the SDK shows the notification. messaging().setBackgroundMessageHandler(async (message) => { Clomni.handlePush(message.data ?? {}); });// App.tsx import { useEffect } from 'react'; import { PermissionsAndroid, Platform } from 'react-native'; import messaging from '@react-native-firebase/messaging'; import Clomni from '@clomni/react-native'; useEffect(() => { if (Platform.OS !== 'android') return; PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS); // Android 13+ messaging().getToken().then((token) => Clomni.setDeviceToken(token)); const unsubscribeToken = messaging().onTokenRefresh((token) => Clomni.setDeviceToken(token)); // Messages while the app is open. const unsubscribeMessage = messaging().onMessage(async (message) => { if (!Clomni.handlePush(message.data ?? {})) { // your app's own push } }); Clomni.setNotificationIcon('clomni_notification_icon'); // the config plugin's notificationIcon return () => { unsubscribeToken(); unsubscribeMessage(); }; }, []);Adi tətbiqdə
AndroidManifest.xml-də<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />elan edin, ağ ikonuandroid/app/src/main/res/drawable/-a qoyun və adınısetNotificationIcon-a verin. -
8
Push: iOS
Clomni iOS push-larını Firebase-dən keçirmədən birbaşa APNs-ə göndərir. Firebase kitabxanası yalnız FCM mesajlarını bildirir, Clomni bildirişinə toxunuşu görmür. Ona görə toxunuşu native kodda tutun:
- Xcode-da Push Notifications capability-sini əlavə edin.
ios/Podfile-a yuxarıdakıpod 'ClomniMessenger'sətrini yazın vəpod installişlədin.- Bu faylı tətbiq hədəfinə əlavə edin:
// ios/<YourApp>/ClomniNotifications.swift import ClomniMessenger import UserNotifications /// Clomni pushes: hidden while the Messenger is open, and a tap opens the conversation. @objc(ClomniNotifications) final class ClomniNotifications: NSObject, UNUserNotificationCenterDelegate { @objc 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() } }application(_:didFinishLaunchingWithOptions:)içində, metod qayıtmazdan əvvəl onu delegate edin:
// AppDelegate.swift UNUserNotificationCenter.current().delegate = ClomniNotifications.shared
// AppDelegate.mm, when the app delegate is Objective-C #import "YourApp-Swift.h" #import <UserNotifications/UserNotifications.h> [UNUserNotificationCenter currentNotificationCenter].delegate = ClomniNotifications.shared;
React Native Firebase sonra delegate-i öz üzərinə götürür və özünə aid olmayan push-ları bu delegate-ə ötürür, sizin FCM push-larınız işləməyə davam edir.
- APNs tokenini JavaScript-dən verin:
if (Platform.OS === 'ios') { await messaging().requestPermission(); const apnsToken = await messaging().getAPNSToken(); // hex if (apnsToken) Clomni.setDeviceToken(apnsToken); }iOS-da Firebase yoxdursa, tokeni native kodda verin:
didRegisterForRemoteNotificationsWithDeviceTokeniçindəClomni.setDeviceToken(deviceToken). Expo-daiosqovluğunuprebuildyaradır: 3-cü və 4-cü addımları öz kiçik config plugin-inizdə saxlayın (withAppDelegate,withXcodeProject), ya daiosqovluğunu repozitoriyada saxlayın. -
9
Problemlər
- «The package doesn't seem to be linked» və ya native modul tapılmır: tətbiqi yenidən build edin, Expo-da development build işlədin.
- iOS-da
ClomniMessengersimvolları üzrə link xətası: Podfile-apod 'ClomniMessenger'sətri vəpod install. - Android-də tətbiq bağlı olanda bildiriş gəlmir:
setBackgroundMessageHandlerindex.js-də, komponentlərdən kənarda olmalıdır. - iOS-da Clomni bildirişinə toxunanda yalnız tətbiq açılır: native delegate (3-cü və 4-cü addımlar) yoxdur və ya gec təyin olunur.
- Üzən düymə tətbiqin soyuq açılışında görünmür. Səbəb: SDK 1.0.1-in xətası, 1.0.2-də düzəlir. O vaxta qədər Messenger-i öz düymənizdən açın.
- Android: tətbiq ikonla yenidən açılanda açıq Messenger itir. Səbəb:
MainActivitysingleTask-dır. SDK 1.0.2-də düzəlir.
-
10
Tam təlimat
- PDF: Clomni Mobile SDK təlimatı, Azərbaycan, ingilis və rus dilində.
- Onlayn: React Native.
- Paneldə: kanalın ayarlar sütununda «Təlimat».