Skip to main content

SDK ReactNative

SDK ReactNative (React Native SDK)

مستندات Zebline SDK

مرحله ۱: معرفی Zebline React Native SDK

Zebline React Native SDK به شما این امکان را می‌دهد که رویدادها (Events) را از اپلیکیشن‌های React Native جمع‌آوری کرده و آن‌ها را به مقصدهای مختلف داده از طریق پلتفرم Zebline ارسال کنید.

⏱️ زمان تقریبی مطالعه این مستند: ۲۳ دقیقه

با استفاده از Zebline React Native SDK می‌توانید:

  • رفتار کاربران را در اپلیکیشن React Native ردیابی کنید
  • داده‌های رویدادی (Event Data) را به ابزارهای تحلیلی، مارکتینگ و دیتابیس‌های مقصد ارسال کنید
  • یک لایه استاندارد و یکپارچه برای مدیریت داده‌های کاربری داشته باشید

برای درک عملی‌تر از نحوه کار SDK، می‌توانید کد منبع آن را در GitHub بررسی کنید.

note

Zebline React Native SDK از پلتفرم tvOS نیز پشتیبانی می‌کند. این قابلیت از نسخه v1.12.0 به بعد در دسترس است.


الزامات راه‌اندازی SDK (SDK Setup Requirements)

برای استفاده از Zebline React Native SDK لازم است پیش‌نیازهای زیر را قبل از شروع پیاده‌سازی فراهم کنید.


پیش‌نیازها

  • ایجاد یک Source از نوع ReactNative در پنل Zebline

  • دریافت Write Key مربوط به Source ایجادشده

  • در اختیار داشتن آدرس‌های زیر:

    • Data Plane URL
    • Control Plane URL

این اطلاعات از بخش Setup در داشبورد Zebline قابل مشاهده و کپی هستند.

نحوه دریافت Write Key در داشبورد Zebline


نکات مهم

  • مقدار Write Key باید دقیقاً همان مقداری باشد که در داشبورد Zebline برای Source شما نمایش داده می‌شود.
  • آدرس‌های Data Plane URL و Control Plane URL از تنظیمات Setup در پنل Zebline قابل دریافت هستند.
  • توصیه می‌شود در محیط توسعه از سطح لاگ VERBOSE و در محیط production از سطوح پایین‌تر استفاده شود.

مقادیر پیش‌فرض Zebline

DATA PLANE URL: https://analytics.zebline.com
CONTROL PLANE URL: https://c.zebline.com

با انجام مراحل بالا، Zebline React Native SDK با موفقیت در پروژه شما فعال می‌شود و می‌توانید ارسال رویدادها و سایر قابلیت‌ها را پیاده‌سازی کنید.

مرحله ۲: نصب Zebline React Native SDK

روش پیشنهادی برای نصب Zebline React Native SDK استفاده از npm است.

برای اضافه کردن SDK به پروژه:

  1. به ریشه (Root) پروژه React Native خود بروید.
  2. پکیج SDK را به عنوان dependency به پروژه اضافه کنید.
npm install @rudderstack/rudder-sdk-react-native --save
info

اگر از yarn استفاده می‌کنید، می‌توانید از دستور معادل آن نیز استفاده کنید.

tip

نام پکیج فنی SDK بدون تغییر باقی مانده است، اما در مستندات و مفاهیم، این SDK به عنوان Zebline SDK معرفی می‌شود.


مرحله ۳: مقداردهی اولیه (Initialize) کلاینت Zebline

از نسخه v3.0.0 به بعد، Zebline React Native SDK از معماری جدید React Native پشتیبانی می‌کند.

۱) ایمپورت SDK

import rudderClient from "@rudderstack/rudder-sdk-react-native";

۲) مقداردهی اولیه SDK

const zeblineInitialise = async () => {
await rudderClient.setup(WRITE_KEY, {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
trackAppLifecycleEvents: true,
recordScreenViews: true,
});
};

zeblineInitialise().catch(console.error);

۳) مقداردهی اولیه با استفاده از useEffect

در صورتی که قصد دارید مقداردهی اولیه SDK را در کامپوننت ریشه (Root Component) انجام دهید، می‌توانید از هوک useEffect استفاده کنید:

useEffect(() => {
const zeblineInitialise = async () => {
await rudderClient.setup(WRITE_KEY, {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
trackAppLifecycleEvents: true,
recordScreenViews: true,
});

console.log('Zebline SDK is initialized');
};

zeblineInitialise().catch(console.error);
}, []);
danger

استفاده از await در متد setup بسیار مهم است تا اطمینان حاصل شود SDK قبل از ارسال هرگونه رویداد به‌درستی مقداردهی شده است.

۴) امضای متد setup

نام پارامترنوع دادهاجباریتوضیح
writeKeyStringبلهWrite Key مربوط به سورس React Native در Zebline
configurationObjectخیرشامل تنظیمات کلاینت Zebline SDK

مرحله ۴: فعال‌سازی پشتیبانی از معماری جدید React Native

Zebline React Native SDK با هر دو معماری قدیمی (Legacy) و جدید React Native سازگار است.

از نسخه v3.0.0 به بعد، این SDK به‌صورت کامل از معماری جدید React Native پشتیبانی می‌کند.

حداقل نسخه‌های مورد نیاز

  • React: نسخه v16.8.0 یا بالاتر
  • React Native: نسخه v0.74.0 یا بالاتر

فعال‌سازی معماری جدید در Android

  1. فایل gradle.properties را در ریشه پروژه Android باز کنید.
  2. مقدار فلگ newArchEnabled را برابر با true قرار دهید.
newArchEnabled=true

برای غیرفعال‌سازی معماری جدید:

newArchEnabled=false

مرحله ۵: پیکربندی کلاینت Zebline SDK

شما می‌توانید رفتار Zebline React Native SDK را با ارسال پارامترهای مختلف در آبجکت configuration هنگام فراخوانی متد setup کنترل کنید.

لیست پارامترهای قابل پیکربندی

پارامترنوعتوضیحمقدار پیش‌فرض
logLevelintتعیین میزان لاگ‌های تولیدشده توسط SDK. برای مشاهده مقادیر قابل پشتیبانی به بخش Debugging مراجعه کنید.RUDDER_LOG_LEVEL.ERROR
dataPlaneUrlstringآدرس Data Plane مربوط به ورک‌اسپیس Zeblinehttps://analytics.zebline.com
flushQueueSizeintتعداد رویدادها در هر batch ارسالی به سرور30
dbCountThresholdintحداکثر تعداد رویدادهای ذخیره‌شده در دیتابیس SQLite. پس از رسیدن به این حد، رویدادهای قدیمی حذف می‌شوند.10000
sleepTimeOutintحداقل زمان انتظار برای ارسال رویدادها به سرور10 ثانیه
configRefreshIntervalintبازه زمانی (به ساعت) برای دریافت مجدد تنظیمات از داشبورد Zebline2
autoSessionTrackingbooleanفعال‌سازی ردیابی خودکار سشن کاربرانtrue
sessionTimeoutintحداکثر زمان عدم فعالیت قبل از پایان سشن300000 ms (5 دقیقه)
trackAppLifecycleEventsbooleanثبت خودکار رویدادهای چرخه حیات اپلیکیشنtrue
enableBackgroundModebooleanارسال رویدادها برای مدت کوتاه قبل از بسته شدن یا رفتن اپلیکیشن به پس‌زمینه (فقط iOS و tvOS)false
enableGzipbooleanفشرده‌سازی (Gzip) درخواست‌های ارسالیtrue
autoCollectAdvertIdbooleanجمع‌آوری خودکار Advertising IDfalse
recordScreenViewsbooleanثبت خودکار Screen Viewfalse
dbEncryptionDBEncryptionفعال‌سازی رمزنگاری دیتابیس با کلید مشخص‌شده-
controlPlaneUrlstringآدرس Control Plane در صورت استفاده از نسخه Open-sourcehttps://c.zebline.com
note

بیشتر پروژه‌ها تنها به تنظیم dataPlaneUrl و در صورت نیاز logLevel احتیاج دارند و سایر پارامترها اختیاری هستند.


مرحله ۶: فشرده‌سازی درخواست‌ها با Gzip

قابلیت Gzip در Zebline React Native SDK این امکان را فراهم می‌کند که درخواست‌های ارسالی رویدادها به‌صورت فشرده ارسال شوند. این کار باعث کاهش حجم داده ارسالی و بهبود عملکرد شبکه می‌شود.

danger

قابلیت Gzip نیازمند نسخه v1.4.0 یا بالاتر از Zebline Server است. در صورت استفاده از نسخه‌های قدیمی‌تر، ممکن است ارسال رویدادها با خطا مواجه شود.

به‌صورت پیش‌فرض، فشرده‌سازی Gzip فعال است.

برای غیرفعال‌سازی، پارامتر enableGzip را هنگام مقداردهی اولیه SDK برابر با false قرار دهید:

await rudderClient.setup(WRITE_KEY, {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
enableGzip: false,
});
info

در اغلب سناریوها، توصیه می‌شود قابلیت Gzip فعال باقی بماند؛ مگر در شرایط خاص مانند محدودیت‌های سرور یا عیب‌یابی (Debug).


مرحله ۷: شناسایی کاربر (Identify)

متد identify در Zebline React Native SDK برای شناسایی یک کاربر و اتصال او به رفتارها و رویدادهای ثبت‌شده استفاده می‌شود. با استفاده از این متد می‌توانید اطلاعاتی مانند نام، ایمیل، موقعیت جغرافیایی و سایر ویژگی‌ها (Traits) را برای کاربر ذخیره کنید.

نمونه استفاده از identify

rudderClient.identify(
"test_userId",
{
email: "testuser@example.com",
location: "UK",
},
null
);

امضای متد identify

نام پارامترنوع دادهاجباریتوضیح
userIdStringبلهشناسه یکتای کاربر
traitsObjectخیراطلاعات و ویژگی‌های کاربر (Traits)
optionObjectخیرتنظیمات اضافی برای رویداد identify

پس از شناسایی کاربر، Zebline SDK اطلاعات کاربر را ذخیره کرده و آن‌ها را به تمام فراخوانی‌های بعدی مانند track یا screen اضافه می‌کند.

در صورتی که نیاز به حذف اطلاعات شناسایی کاربر داشته باشید، می‌توانید از متد reset استفاده کنید.

tip

بهتر است متد identify پس از لاگین موفق کاربر یا زمانی که شناسه قطعی کاربر در دسترس است فراخوانی شود.

نحوه تنظیم Device ID در Android و iOS

SDK چگونه Device ID را در Android و iOS تنظیم می‌کند؟

  • در دستگاه‌های Android، مقدار deviceId در اولین بوت دستگاه ایجاد می‌شود. این مقدار بین نصب‌های مختلف اپلیکیشن و بین اپلیکیشن‌ها ثابت می‌ماند و تنها پس از Factory Reset تغییر می‌کند.
  • بر اساس مستندات Apple، چند اپلیکیشن از یک Vendor مشترک، دارای یک deviceId یکسان هستند. اگر تمام اپلیکیشن‌های آن Vendor حذف و مجدداً نصب شوند، یک deviceId جدید به آن‌ها اختصاص داده می‌شود.

غیرفعال‌سازی جمع‌آوری Device ID

از نسخه v1.9.0 به بعد، می‌توانید جمع‌آوری Device ID را با تنظیم مقدار collectDeviceId برابر با false در شیء Configuration غیرفعال کنید.

تغییرات اعمال‌شده در صورت غیرفعال‌سازی

در صورتی که collectDeviceId روی false تنظیم شود، رفتار SDK به شکل زیر خواهد بود:

  • SDK مقدار context.device.id را در Payload رویدادها ارسال نمی‌کند
  • اگر مقدار فعلی anonymousId برابر با Device ID باشد، SDK آن را با یک UUID جدید جایگزین می‌کند

نمونه پیکربندی

const config = {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
collectDeviceId: false,
};

await rudderClient.setup(WRITE_KEY, config);

نحوه تنظیم anonymous ID در Zebline React Native SDK

anonymous ID چگونه توسط SDK تنظیم می‌شود؟

نصب جدید (Fresh Installation)

در نصب‌های جدید، Zebline React Native SDK همواره از یک UUID به‌عنوان anonymousId استفاده می‌کند؛ فرقی نمی‌کند مقدار collectDeviceId برابر با true یا false باشد.


ارتقا SDK از نسخه‌های قدیمی

اگر SDK اپلیکیشن خود را از نسخه‌های قدیمی‌تر (کمتر از v1.9.0) ارتقا داده‌اید، رفتار SDK به شکل زیر خواهد بود:

  • SDK به استفاده از Device ID به‌عنوان anonymousId ادامه می‌دهد تا زمانی که مقدار collectDeviceId روی false تنظیم شود
  • در صورتی که collectDeviceId را برابر با false قرار دهید، SDK بررسی می‌کند که آیا anonymousId فعلی یک Device ID است یا خیر؛ در صورت مثبت بودن، یک UUID جدید به‌عنوان anonymousId تنظیم می‌شود
  • اگر قبلاً با استفاده از متد putAnonymousId مقدار anonymousId را به‌صورت دستی تنظیم کرده باشید، SDK حتی با collectDeviceId: false نیز این مقدار را تغییر نخواهد داد

بازنویسی (Override) anonymous ID

در صورت نیاز می‌توانید مقدار anonymousId را به‌صورت دستی و دلخواه تنظیم کنید. برای این کار از متد putAnonymousId استفاده می‌شود:

rudderClient.putAnonymousId(ANONYMOUS_ID);

دریافت anonymous ID فعلی

می‌توانید مقدار anonymousId فعلی (چه مقدار تنظیم‌شده توسط SDK و چه مقدار تنظیم‌شده توسط کاربر) را از Context داخلی SDK دریافت کنید:

const getAnonymousId = async () => {
const context = await rudderClient.getRudderContext();
const anonymousId = context?.traits?.anonymousId;
console.log('Anonymous ID:', anonymousId);
};

تنظیم Custom ID در Zebline React Native SDK

Setting Custom ID

در Zebline React Native SDK می‌توانید علاوه بر userId استاندارد، یک یا چند Custom ID (یا External ID) را در زمان فراخوانی متد identify ارسال کنید.

Zebline این مقادیر را در مسیر زیر ذخیره می‌کند:

context.externalId

نمونه کد: ارسال externalId در identify

در مثال زیر، یک External ID سفارشی (مثلاً شناسه کاربر در سیستم Braze یا CRM) به رویداد identify اضافه شده است:

const options = {
externalIds: [
{
id: 'some_external_id_1',
type: 'brazeExternalId',
},
],
};

rudderClient.identify(
'1hKQmR4GR1m',
{
email: 'alex@example.com',
location: 'UK',
},
options
);

موارد استفاده رایج از Custom ID

  • اتصال شناسه کاربر در Zebline به:

    • CRM
    • CDPهای دیگر
    • سیستم‌های تبلیغاتی
    • ابزارهایی مانند Braze، Amplitude، Mixpanel و …
  • یکپارچه‌سازی چند شناسه مختلف برای یک کاربر واحد


Track (ثبت رویدادها) در Zebline React Native SDK

ثبت فعالیت کاربر با Track

در Zebline React Native SDK می‌توانید فعالیت‌ها و تعاملات کاربران را با استفاده از متد track ثبت کنید. هر فعالیت کاربر به‌عنوان یک Event (رویداد) در نظر گرفته می‌شود.


نمونه ارسال یک Event

در مثال زیر، یک رویداد نمونه به همراه Propertyهای ساده و تو در تو ارسال شده است:

rudderClient.track('test_track_event', {
test_key_1: 'test_value_1',
test_key_2: {
test_child_key_1: 'test_child_value_1',
},
});

امضای متد track

متد track دارای امضای زیر است:

نام پارامترنوع دادهاجباریتوضیح
nameStringبلهنام رویداد ثبت‌شده
propertyObjectخیرداده‌ها و Propertyهای اضافی مرتبط با رویداد
optionsObjectخیرتنظیمات و گزینه‌های اضافی برای رویداد

ردیابی خودکار رویدادهای چرخه عمر اپلیکیشن

Zebline React Native SDK به‌صورت خودکار برخی از رویدادهای اختیاری چرخه عمر اپلیکیشن را ثبت می‌کند، از جمله:

  • Application Installed
  • Application Updated
  • Application Opened
  • Application Backgrounded

این رویدادها به شما کمک می‌کنند تا درک بهتری از رفتار کاربران در سطح نصب، به‌روزرسانی و استفاده از اپلیکیشن داشته باشید.


غیرفعال‌سازی رویدادهای چرخه عمر

در صورت نیاز می‌توانید ثبت این رویدادها را با تنظیم مقدار trackAppLifecycleEvents برابر با false در پیکربندی SDK غیرفعال کنید:

await rudderClient.setup(WRITE_KEY, {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
trackAppLifecycleEvents: false,
});

Screen (ثبت مشاهده صفحه) در Zebline React Native SDK

ثبت مشاهده صفحه توسط کاربر

در Zebline React Native SDK می‌توانید با استفاده از متد screen ثبت کنید که کاربر چه زمانی یک صفحه (Screen) را در اپلیکیشن موبایل مشاهده کرده است. همچنین امکان ارسال Propertyهای اضافی همراه با این رویداد وجود دارد.


نمونه ارسال Screen Event

در مثال زیر، مشاهده یک صفحه به‌همراه یک Property سفارشی ثبت شده است:

rudderClient.screen('Main Activity', {
foo: 'bar',
});

امضای متد screen

علاوه بر روش ساده بالا، متد screen از امضای زیر نیز پشتیبانی می‌کند:

نام پارامترنوع دادهاجباریتوضیح
screenNameStringبلهنام صفحه‌ای که کاربر مشاهده کرده است
propertyObjectخیرPropertyهای اضافی که همراه با Screen Event ارسال می‌شوند
optionObjectخیرتنظیمات و گزینه‌های اضافی برای رویداد Screen

ثبت خودکار Screen (Automatic Screen Recording) در Zebline React Native SDK

فعال‌سازی ثبت خودکار Screen

در Zebline React Native SDK می‌توانید ثبت خودکار مشاهده صفحات (Screen Views) را با تنظیم مقدار recordScreenViews برابر با true در زمان مقداردهی اولیه SDK فعال کنید.

با فعال‌سازی این قابلیت، SDK به‌صورت خودکار برای هر صفحه‌ای که کاربر مشاهده می‌کند یک رویداد screen ارسال می‌کند.

مقدار پیش‌فرض recordScreenViews برابر با false است.


نکته مهم درباره recordScreenViews


ثبت Screenهای React Native با React Navigation

برای ثبت Screen Viewهای مربوط به React Native Screens (مثلاً با استفاده از @react-navigation/native)، می‌توانید از الگوی زیر استفاده کنید:

import rudderClient from '@rudderstack/rudder-sdk-react-native';
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';

const App = () => {
const routeNameRef = React.useRef();
const navigationRef = React.useRef();

return (
<NavigationContainer
ref={navigationRef}
onReady={() => {
routeNameRef.current = navigationRef.current.getCurrentRoute().name;
}}
onStateChange={async () => {
const previousRouteName = routeNameRef.current;
const currentRouteName = navigationRef.current.getCurrentRoute().name;

if (previousRouteName !== currentRouteName) {
rudderClient.screen(currentRouteName);
}

routeNameRef.current = currentRouteName;
}}
>
{/* Screens */}
</NavigationContainer>
);
};

export default App;

چه زمانی از Automatic Screen Recording استفاده کنیم؟

  • زمانی که ساختار اپلیکیشن مبتنی بر Native Screenها است
  • برای کاهش نیاز به فراخوانی دستی screen
  • برای داشتن پوشش کامل Screen Viewها در تحلیل مسیر کاربر

Group (گروه‌بندی کاربران) در Zebline React Native SDK

اتصال کاربر به یک Group

در Zebline React Native SDK می‌توانید با استفاده از متد group یک کاربر شناسایی‌شده (identified user) را به یک Group متصل کنید.

Group می‌تواند نمایانگر مفاهیمی مانند:

  • شرکت (Company)
  • سازمان (Organization)
  • حساب کاربری (Account)
  • تیم یا هر موجودیت تجاری دیگر

همچنین می‌توانید ویژگی‌ها (Traits) مرتبط با Group مانند نام شرکت، شهر، کشور، تعداد کارمندان و … را ثبت کنید.


نمونه استفاده از متد group

در مثال زیر، کاربر به یک Group با شناسه company123 متصل شده و چند Trait برای آن ثبت شده است:

rudderClient.group('company123', {
city: 'New Orleans',
state: 'Louisiana',
country: 'USA',
});

امضای متد group

متد group دارای امضای زیر است:

نام پارامترنوع دادهاجباریتوضیح
groupIdStringبلهشناسه یکتای Group
traitsObjectخیرویژگی‌ها و مشخصات Group
optionObjectخیرتنظیمات و گزینه‌های اضافی برای رویداد Group

موارد استفاده رایج از Group

  • اتصال کاربران به شرکت یا سازمان مربوطه
  • تحلیل رفتار کاربران در سطح سازمانی
  • ارسال داده‌های Group به ابزارهای CRM و Analytics
  • پیاده‌سازی سناریوهای B2B و Account-based Analytics

Alias (تغییر شناسه کاربر) در Zebline React Native SDK

اتصال کاربر به یک شناسه جدید (Alias)

در Zebline React Native SDK متد alias به شما این امکان را می‌دهد که یک کاربر را به یک شناسه جدید متصل کنید.

این API یک قابلیت پیشرفته محسوب می‌شود و معمولاً در سناریوهایی استفاده می‌شود که لازم است شناسه کاربر را به‌صورت صریح تغییر دهید؛ به‌خصوص برای مدیریت هویت کاربران در برخی Destinationهای Downstream.


سناریوی پیشنهادی استفاده از Alias

Zebline توصیه می‌کند در شرایطی از فراخوانی پیش‌فرض alias استفاده کنید که هدف شما جایگزین کردن userId فعلی با یک userId جدید است.


نمونه استفاده (فراخوانی پیش‌فرض)

تنظیم فقط شناسه جدید کاربر

در این حالت، فقط شناسه جدید ارسال می‌شود و SDK به‌صورت خودکار شناسه قبلی را مدیریت می‌کند:

rudderClient.alias('newId');

نمونه استفاده پیشرفته

تنظیم شناسه جدید همراه با Optionهای رویداد

در این حالت می‌توانید علاوه بر شناسه جدید، Optionهای سطح رویداد را نیز ارسال کنید:

rudderClient.alias('newId', options);

در این سناریو، SDK به‌صورت خودکار فیلد previousId را با مقدار ذخیره‌شده قبلی (userId یا anonymousId) مقداردهی می‌کند.


امضای متد alias

جدول زیر پارامترهای پشتیبانی‌شده در API alias را نشان می‌دهد:

نام پارامترنوع دادهتوضیح
newIdStringشناسه جدید (userId) که باید به کاربر اختصاص داده شود (الزامی)
previousIdStringشناسه قبلی کاربر (اختیاری)
optionsObjectOptionهای سطح رویداد

رفتار SDK پس از فراخوانی alias

پس از فراخوانی متد alias:

  • شناسه قدیمی کاربر با شناسه جدید جایگزین می‌شود
  • شناسه جدید (newId) در Sessionهای بعدی نیز حفظ خواهد شد
  • تمام رویدادهای بعدی با شناسه جدید ارسال می‌شوند

Reset و رمزنگاری پایگاه داده در Zebline React Native SDK

Reset (ریست کردن اطلاعات کاربر)

در Zebline React Native SDK می‌توانید با استفاده از متد reset اطلاعات ذخیره‌شده کاربر (User Traits) را پاک کنید.

در صورتی که مقدار true به این متد ارسال شود، علاوه بر پاک‌سازی Traits، مقدار anonymousId نیز با یک UUID جدید ریست می‌شود (برای SDK نسخه v1.9.0 و بالاتر).

نمونه استفاده از reset با ریست کامل

await rudderClient.reset(true);

پاک‌سازی فقط User Traits

اگر فقط قصد پاک‌سازی Traits کاربر را دارید و نمی‌خواهید anonymousId تغییر کند، مقدار false را ارسال کنید:

await rudderClient.reset(false);

رمزنگاری پایگاه داده (Encrypting Database)

برای فعال‌سازی رمزنگاری دیتابیس داخلی SDK، مراحل زیر را دنبال کنید.


مرحله ۱: نصب پلاگین رمزنگاری دیتابیس

در ریشه پروژه، پلاگین مربوط به رمزنگاری دیتابیس را نصب کنید:

npm install @rudderstack/rudder-plugin-db-encryption-react-native

مرحله ۲: ایمپورت DBEncryption

import DBEncryption from '@rudderstack/rudder-plugin-db-encryption-react-native';

مرحله ۳: ایجاد شیء DBEncryption و مقداردهی در زمان setup

در این مرحله، یک شیء از کلاس DBEncryption ساخته و آن را در زمان مقداردهی اولیه SDK ارسال می‌کنیم:

const dbEncryption = new DBEncryption('encryption_key', true);

const initialise = async () => {
await rudderClient.setup(WRITE_KEY, {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
dbEncryption: dbEncryption,
});
};

initialise().catch(console.error);

پارامترهای DBEncryption

کلاس DBEncryption پارامترهای زیر را می‌پذیرد:

پارامترنوعتوضیح
keystringکلید مورد استفاده برای رمزنگاری و رمزگشایی دیتابیس
enablebooleanتعیین می‌کند که رمزنگاری فعال یا غیرفعال باشد

غیرفعال‌سازی رمزنگاری دیتابیس

برای حذف رمزنگاری، کافی است مقدار enable را برابر با false قرار دهید:

const dbEncryption = new DBEncryption('encryption_key', false);

ملاحظات iOS برای رمزنگاری دیتابیس (SQLCipher)

حذف رمزنگاری دیتابیس

برای حذف رمزنگاری از دیتابیس، کافی است شیء DBEncryption را با کلید رمزنگاری و مقدار enable برابر با false پیکربندی کنید:

const dbEncryption = new DBEncryption('encryption_key', false);

دستورالعمل‌های مخصوص iOS (SQLCipher)

پلاگین rudder-plugin-db-encryption-react-native برای انجام رمزنگاری از SQLCipher CocoaPod در پشت صحنه استفاده می‌کند.

این CocoaPod نیاز دارد که هرگونه ارجاع به کتابخانه استاندارد SQLite سیستم حذف شود تا SQLCipher به‌درستی لینک و استفاده شود.


مشکل رایج لینک شدن SQLCipher

در برخی پروژه‌ها (به‌ویژه زمانی که از CocoaPods یا Sub-projectهای دیگر استفاده می‌شود)، ممکن است به‌صورت ناخواسته SQLite استاندارد قبل از SQLCipher لینک شود.

در این حالت:

  • اپلیکیشن ممکن است Build و Run شود
  • اما رمزنگاری دیتابیس فعال نخواهد شد

این مشکل معمولاً با خطای زیر از سمت SDK قابل شناسایی است:

RSDBPersistentManager: createDB: Cannot encrypt the database as SQLCipher wasn't linked correctly.

نحوه رفع مشکل لینک شدن SQLCipher

برای رفع این مشکل، باید تنظیمات لینکینگ پروژه را به‌گونه‌ای تغییر دهید که Xcode ابتدا SQLCipher را لینک کند.

مراحل انجام کار

  1. تنظیمات Project-level Build Settings را باز کنید (نه Target-level).
  2. گزینه Other Linker Flags را پیدا کنید.
  3. بسته به نحوه استفاده شما از SQLCipher، یکی از دستورات زیر را اضافه کنید.

تنظیمات Other Linker Flags بر اساس سناریو

سناریودستور (Command)توضیحات
استفاده از نسخه Commercial Static SQLCipher$(PROJECT_DIR)/sqlcipher-static-ios/ios-libs/libsqlcipher-ios.aمسیر را بر اساس محل قرارگیری libsqlcipher-ios.a تنظیم کنید
استفاده از sqlcipher.xcodeproj در ریپازیتوری SQLCipher$(BUILT_PRODUCTS_DIR)/libsqlcipher.a
استفاده از SQLCipher CocoaPod با use_frameworks! فعال-framework SQLCipher
استفاده از SQLCipher CocoaPod بدون use_frameworks!-lSQLCipher

بررسی نهایی تنظیمات Linker Flags در Xcode (SQLCipher)

اطمینان از اعمال صحیح تنظیمات در سطح Project

پس از اضافه‌کردن Linker Flag در تنظیمات Project-level Build Settings، باید تنظیماتی مشابه تصویر زیر مشاهده کنید:

image_group{"layout":"carousel","aspect_ratio":"16:9","query":["Xcode Other Linker Flags SQLCipher project level"],"num_per_query":1}

در این مرحله بررسی کنید که مقدار مربوط به SQLCipher (مانند -framework SQLCipher یا -lSQLCipher) در سطح Project اضافه شده باشد.


بررسی تنظیمات در سطح Target

پس از اعمال تنظیمات در سطح Project، لازم است تنظیمات Target-level Build Settings را نیز بررسی کنید تا اطمینان حاصل شود که SQLCipher در اولویت لینک شدن قرار دارد.

تنظیمات Target باید مشابه تصویر زیر باشد و SQLCipher در لیست کتابخانه‌ها در ابتدای لیست نمایش داده شود:

image_group{"layout":"carousel","aspect_ratio":"16:9","query":["Xcode Other Linker Flags target level SQLCipher"],"num_per_query":1}


نکات نهایی برای جلوگیری از خطا

  • اطمینان حاصل کنید که SQLCipher قبل از SQLite استاندارد لینک می‌شود
  • پس از هر تغییر، حتماً گزینه Product → Clean Build Folder را اجرا کنید
  • در صورت مشاهده خطای رمزنگاری، لاگ‌های Build و Runtime را مجدداً بررسی کنید

فعال‌سازی / غیرفعال‌سازی رهگیری کاربر از طریق optOut API (پشتیبانی از GDPR)

Zebline SDK این امکان را فراهم می‌کند که کاربران (برای مثال کاربران اتحادیه اروپا) بتوانند تا زمان اعلام رضایت، از رهگیری فعالیت‌های خود انصراف دهند. این قابلیت از طریق API به نام optOut در اختیار شما قرار می‌گیرد.

API مربوط به optOut یک مقدار بولی (true یا false) دریافت می‌کند تا رهگیری فعالیت‌های کاربر را فعال یا غیرفعال کند. این تنظیم حتی پس از ری‌استارت شدن دستگاه نیز حفظ می‌شود.

غیرفعال‌سازی رهگیری کاربر

برای غیرفعال کردن رهگیری فعالیت‌های کاربر، از قطعه کد زیر استفاده کنید:

await rudderClient.optOut(true);

فعال‌سازی مجدد رهگیری پس از اعلام رضایت کاربر

پس از اینکه کاربر رضایت خود را اعلام کرد، می‌توانید رهگیری را دوباره فعال کنید:

await rudderClient.optOut(false);

ارسال رویدادهای رهگیری‌شده قبل از بسته شدن یا رفتن اپ به پس‌زمینه

برای اطمینان از اینکه رویدادهایی که درست قبل از بسته شدن یا رفتن اپ به پس‌زمینه ثبت می‌شوند، بلافاصله به سرورهای Zebline ارسال شوند (و نه در اجرای بعدی اپ)، باید گزینه enableBackgroundMode را هنگام مقداردهی اولیه SDK روی true تنظیم کنید.

const zeblineInitialise = async () => {
await rudderClient.setup(WRITE_KEY, {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
enableBackgroundMode: true,
});
};

zeblineInitialise().catch(console.error);

با فعال‌سازی این گزینه، اپلیکیشن از iOS درخواست زمان اجرای اضافی در پس‌زمینه می‌کند تا Zebline SDK بتواند همه رویدادهای باقی‌مانده را قبل از بسته شدن یا Background شدن اپ ارسال کند.

رهگیری سشن‌های کاربران (Tracking user sessions)

به‌صورت پیش‌فرض، Zebline React Native SDK سشن‌های کاربران را به‌صورت خودکار رهگیری می‌کند. Zebline به‌صورت خودکار شروع و پایان هر سشن را بر اساس مدت زمان عدم فعالیت تعریف‌شده در تنظیمات SDK مشخص می‌کند (مقدار پیش‌فرض ۵ دقیقه است).

const zeblineInitialise = async () => {
await rudderClient.setup(WRITE_KEY, {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
trackAppLifecycleEvents: true,
autoSessionTracking: true, // برای غیرفعال‌سازی رهگیری خودکار، مقدار false قرار دهید
sessionTimeout: 5 * 60 * 1000, // مدت زمان عدم فعالیت (۵ دقیقه)
});
};

zeblineInitialise().catch(console.error);

برای غیرفعال کردن رهگیری خودکار سشن‌ها، مقدار autoSessionTracking را روی false قرار دهید.

برای اطلاعات بیشتر درباره سشن‌ها و نحوه رهگیری آن‌ها، به مستندات Session Tracking مراجعه کنید.


دریافت شناسه سشن (Getting the session ID)

برای دریافت شناسه سشن جاری، می‌توانید از متد getSessionId استفاده کنید. اگر در لحظه فراخوانی، سشنی فعال نباشد، مقدار null برگردانده می‌شود.

const sessionId = await rudderClient.getSessionId();

تنظیم context سفارشی (Setting custom context)

تنظیم context سفارشی هنگام ارسال رویداد

برای اضافه کردن اطلاعات context سفارشی، می‌توانید شیء options را هنگام ارسال رویدادها ارسال کنید:

const options = {
tier: {
category: 'premium',
type: 'gold',
},
};

تنظیم context سفارشی هنگام مقداردهی اولیه SDK (While initializing SDK)

می‌توانید هنگام مقداردهی اولیه Zebline React Native SDK، اطلاعات context سفارشی را تنظیم کنید تا برای رویدادهای بعدی استفاده شوند:

const config = {
dataPlaneUrl: TEST_DATAPLANE_URL,
};

await rudderClient.setup(TEST_WRITE_KEY, config, options);

نکات مهم:

  • Zebline React Native SDK اطلاعات context سفارشی تنظیم‌شده در زمان مقداردهی اولیه را برای رویدادهای بعدی ذخیره می‌کند، اما این اطلاعات بین سشن‌ها حفظ نمی‌شود.
  • فراخوانی متد reset باعث پاک شدن تمام اطلاعات context سفارشی تنظیم‌شده در زمان مقداردهی اولیه SDK می‌شود.

تنظیم context سفارشی هنگام ارسال رویداد (While sending events)

برای تنظیم context سفارشی فقط برای یک رویداد خاص، می‌توانید شیء options را هنگام ارسال رویداد ارسال کنید:

rudderClient.track(
'Custom Track Event',
{
property1: 'value1',
property2: 'value2',
},
options,
);

نکات مهم:

  • برای هر رویدادی که نیاز به context سفارشی دارد، باید شیء options را به‌صورت جداگانه ارسال کنید.
  • اطلاعات context ارسال‌شده همراه یک رویداد، برای رویدادهای بعدی ذخیره نمی‌شود.
  • context ارسال‌شده هنگام ارسال رویداد، نسبت به context تنظیم‌شده در زمان مقداردهی اولیه SDK اولویت بالاتری دارد.

تنظیم توکن دستگاه (Setting the device token)

می‌توانید از توکن دستگاه برای ارسال پوش نوتیفیکیشن به مقصدهایی که از آن پشتیبانی می‌کنند استفاده کنید. Zebline این توکن را در مسیر context.device.token ذخیره می‌کند.

برای تنظیم یک توکن دستگاه سفارشی، Zebline React Native SDK متد putDeviceToken را ارائه می‌دهد:

rudderClient.putDeviceToken('<device_token>');

دریافت خودکار شناسه تبلیغاتی (Capturing advertisement ID automatically)

Zebline به‌صورت خودکار شناسه تبلیغاتی (Advertising ID) را از اپلیکیشن‌های اندرویدی جمع‌آوری می‌کند، مشروط بر اینکه گزینه autoCollectAdvertId هنگام مقداردهی اولیه SDK روی true تنظیم شده باشد.

برای استفاده از این قابلیت، اطمینان حاصل کنید که:

  • کلاس com.google.android.gms.ads.identifier.AdvertisingIdClient در classpath اپلیکیشن اندروید شما وجود دارد.
  • گزینه Limit Ad Tracking روی دستگاه اندرویدی فعال نباشد.

نمونه‌ای از فعال‌سازی دریافت خودکار شناسه تبلیغاتی:

await rudderClient.setup(WRITE_KEY, {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
autoCollectAdvertId: true,
});

تنظیم دستی شناسه تبلیغاتی (Setting advertisement ID manually)

می‌توانید با استفاده از متد putAdvertisingId شناسه تبلیغاتی را به‌صورت دستی تنظیم کنید. این متد را می‌توان قبل یا بعد از مقداردهی اولیه SDK فراخوانی کرد و مقدار آن در طول سشن حفظ می‌شود.

مراحل تنظیم شناسه تبلیغاتی به‌صورت دستی

1. ایمپورت Platform

import { Platform } from 'react-native';

2. تنظیم شناسه تبلیغاتی بر اساس پلتفرم

switch (Platform.OS) {
case 'ios':
await rudderClient.putAdvertisingId('IOS-ADVERTISING-ID');
break;
case 'android':
await rudderClient.putAdvertisingId('ANDROID-ADVERTISING-ID');
break;
}

نکات مهم:

  • متد putAdvertisingId تنها یک پارامتر از نوع string می‌پذیرد.
  • در اندروید، اگر autoCollectAdvertId روی true تنظیم شده باشد و هم‌زمان از putAdvertisingId استفاده کنید، مقدار دستی ارسال‌شده اولویت دارد.

پاک‌سازی شناسه تبلیغاتی (Clearing advertisement ID)

برای حذف شناسه تبلیغاتی تنظیم‌شده، می‌توانید از متد clearAdvertisingId استفاده کنید:

await rudderClient.clearAdvertisingId();

نکات مهم:

  • حتماً این متد را بعد از مقداردهی اولیه SDK فراخوانی کنید.
  • در اندروید، پاک‌سازی شناسه تبلیغاتی باعث می‌شود SDK دوباره به‌صورت خودکار شناسه تبلیغاتی را جمع‌آوری کند، اگر autoCollectAdvertId برابر true باشد.
  • برای جلوگیری از جمع‌آوری مجدد خودکار، مقدار autoCollectAdvertId را روی false تنظیم کنید.

ثبت Callbackها (Registering callbacks)

Zebline React Native SDK این امکان را فراهم می‌کند که پس از موفقیت‌آمیز بودن یک یکپارچه‌سازی در حالت Device-mode، یک callback اجرا شود. با استفاده از این قابلیت می‌توانید هر عملیاتی که مدنظر دارید (مانند لاگ‌گیری، فعال‌سازی یک feature یا ارسال پیام داخلی) را پس از آماده شدن مقصد انجام دهید.

نمونه ثبت callback برای یک مقصد

در مثال زیر، یک callback برای مقصد App Center ثبت می‌شود:

await rudderClient.registerCallback('App Center', () => {
console.log('App Center is ready');
});

امضای متد registerCallback

نام پارامترنوع دادهاجباریتوضیح
destinationNamestringبلهنام نمایشی مقصد در حالت Device-mode
callbackFunctionبلهتابعی که پس از موفقیت یکپارچه‌سازی اجرا می‌شود

فیلتر کردن رویدادها (Filtering events)

هنگام ارسال رویدادها به مقاصد در حالت Device-mode، می‌توانید به‌صورت صریح مشخص کنید که کدام رویدادها:

  • اجازه عبور داشته باشند (Allowlist)
  • یا حذف شوند (Denylist)

این کار به شما کمک می‌کند کنترل دقیق‌تری روی داده‌های ارسالی به هر مقصد داشته باشید و از ارسال رویدادهای غیرضروری جلوگیری کنید.

فعال‌سازی / غیرفعال‌سازی ارسال رویدادها برای مقاصد خاص

Zebline React Native SDK این امکان را فراهم می‌کند که ارسال رویدادها را برای یک مقصد مشخص یا تمام مقاصدی که سورس به آن‌ها متصل است فعال یا غیرفعال کنید. این کار از طریق تعریف یک شیء تنظیمات و ارسال آن به SDK انجام می‌شود.

تعریف تنظیمات مقاصد (Destinations)

در مثال زیر، ارسال رویدادها برای برخی مقاصد فعال و برای برخی دیگر غیرفعال شده است:

const options = {
integrations: {
// مقدار پیش‌فرض برای "All" برابر true است
All: false,

// تعیین مقصد بر اساس نام نمایشی آن
Amplitude: true,
Mixpanel: false,
},
};

روش‌های ارسال تنظیمات مقاصد به SDK

دو روش برای اعمال تنظیمات مقاصد وجود دارد:

1. ارسال تنظیمات هنگام مقداردهی اولیه SDK

این روش زمانی مناسب است که بخواهید ارسال رویدادها را برای تمام فراخوانی‌های SDK به مقاصد مشخصی فعال یا غیرفعال کنید.

rudderClient.setup(WRITE_KEY, config, options);

۲. ارسال تنظیمات مقاصد هنگام ارسال رویداد (Passing destinations while making event calls)

این روش زمانی کاربردی است که بخواهید ارسال رویداد را فقط برای یک رویداد خاص به مقاصد مشخصی فعال یا غیرفعال کنید، یا بخواهید تنظیمات مقاصدی که هنگام مقداردهی اولیه SDK تعریف شده‌اند را برای یک رویداد خاص override کنید.

در مثال زیر، تنظیمات مقاصد از طریق شیء options مستقیماً هنگام ارسال رویداد اعمال می‌شود:

rudderClient.track(
'test_track_event',
{
test_key_1: 'test_value_1',
},
options,
);

API ارسال فوری رویدادها (flush API)

Zebline React Native SDK از متد flush() پشتیبانی می‌کند. این متد تمام رویدادهای ذخیره‌شده در دیتابیس محلی را دریافت کرده، آن‌ها را بر اساس اندازه صف مشخص‌شده به چند batch تقسیم می‌کند و سپس به سرور Zebline ارسال می‌کند.

نحوه عملکرد flush

  • رویدادها بر اساس مقدار flushQueueSize به batchهای جداگانه تقسیم می‌شوند.
  • به‌عنوان مثال، اگر مقدار flushQueueSize برابر ۳۰ باشد و ۱۸۰ رویداد در دیتابیس وجود داشته باشد، SDK آن‌ها را در قالب ۶ batch شامل ۳۰ رویداد ارسال می‌کند.
  • اگر ارسال یک batch به هر دلیلی ناموفق باشد، برای حفظ ترتیب پیام‌ها، batchهای باقی‌مانده ارسال نخواهند شد.
  • یک batch در صورتی ناموفق در نظر گرفته می‌شود که بعد از ۳ بار تلاش همچنان به سرور Zebline ارسال نشود.

Device-mode

در حالت Device-mode، متد flush() علاوه بر ارسال رویدادها به سرور Zebline، در صورت پشتیبانی، متد flush() مربوط به SDK مقصد را نیز فراخوانی می‌کند.

عیب‌یابی (Debugging)

در صورتی که هنگام استفاده از Zebline React Native SDK با مشکل مواجه شدید، می‌توانید با فعال‌سازی لاگ‌های سطح بالا (DEBUG یا VERBOSE) علت مشکل را بررسی کنید.


فعال‌سازی لاگ‌ها

1. افزودن RUDDER_LOG_LEVEL به import

ابتدا باید import مربوط به سطح لاگ را به کد خود اضافه کنید:

import rudderClient, {
RUDDER_LOG_LEVEL,
} from '@rudderstack/rudder-sdk-react-native';

2. تنظیم سطح لاگ هنگام مقداردهی اولیه SDK

سپس هنگام فراخوانی متد setup، سطح لاگ موردنظر را مشخص کنید:

await rudderClient.setup(WRITE_KEY, {
dataPlaneUrl: DATA_PLANE_URL,
controlPlanUrl: CONTROL_PLANE_URL,
logLevel: RUDDER_LOG_LEVEL.DEBUG, // یا VERBOSE
});

این کار باعث می‌شود لاگ‌های دقیق‌تری از عملکرد SDK در کنسول نمایش داده شوند.


سطوح پشتیبانی‌شده لاگ

می‌توانید مقدار logLevel را روی یکی از مقادیر زیر تنظیم کنید:

  • NONE – بدون لاگ
  • ERROR – فقط خطاها
  • WARN – هشدارها و خطاها
  • INFO – اطلاعات عمومی، هشدارها و خطاها
  • DEBUG – اطلاعات کامل برای عیب‌یابی
  • VERBOSE – بیشترین جزئیات ممکن (مناسب برای توسعه)

پرسش‌های متداول (FAQ)


خیر، نیازی به link کردن SDK نیست، زیرا Zebline React Native SDK به‌صورت خودکار (auto-link) به پروژه متصل می‌شود.

در صورتی که قبلاً SDK را به‌صورت دستی و با دستور react-native link اضافه کرده‌اید و اکنون با مشکل مواجه شده‌اید، می‌توانید با دستور زیر آن را unlink کنید:

react-native unlink zebline-sdk-react-native

چرا باید از کلمه کلیدی await استفاده کنم؟

متدهایی که توسط Zebline React Native SDK ارائه می‌شوند، asynchronous هستند. اگر به رفتار همزمان (synchronous) نیاز دارید، باید از کلمه کلیدی await استفاده کنید.


آیا لازم است چیزی به قوانین ProGuard اضافه کنم؟

اگر از ProGuard در حالت full mode برای بهینه‌سازی اپلیکیشن اندرویدی خود استفاده می‌کنید، باید قوانین موردنیاز را به فایل ProGuard اضافه کنید.

تنظیم قوانین ProGuard و پرسش‌های تکمیلی


قوانین ProGuard برای Android

در صورتی که از ProGuard در حالت full mode استفاده می‌کنید (به‌خصوص در نسخه‌های قدیمی Android SDK)، لازم است قوانین زیر را به فایل ProGuard پروژه اندرویدی خود اضافه کنید تا عملکرد Zebline React Native SDK به‌درستی حفظ شود:

// Reporter Module
-keep class com.rudderstack.android.ruddermetricsreporterandroid.models.LabelEntity { *; }
-keep class com.rudderstack.android.ruddermetricsreporterandroid.models.MetricEntity { *; }
-keep class com.rudderstack.android.ruddermetricsreporterandroid.models.ErrorEntity { *; }

// Required for the usage off TypeToken class in Utils.converToMap, Utils.convertToList
-keep class com.google.gson.reflect.TypeToken { *; }
-keep class * extends com.google.gson.reflect.TypeToken

// Required for the serialization of SourceConfig once it is downloaded.
-keep class com.google.gson.internal.LinkedTreeMap { *; }
-keep class * implements java.io.Serializable { *; }
-keep class com.rudderstack.rudderjsonadapter.RudderTypeAdapter { *; }
-keep class * extends com.rudderstack.rudderjsonadapter.RudderTypeAdapter

// Required to ensure the DefaultPersistenceProviderFactory is not removed by Proguard
// and works as expected even when the customer is not using encryption feature.
-dontwarn net.sqlcipher.Cursor
-dontwarn net.sqlcipher.database.SQLiteDatabase$CursorFactory
-dontwarn net.sqlcipher.database.SQLiteDatabase
-dontwarn net.sqlcipher.database.SQLiteOpenHelper
-keep class com.rudderstack.android.sdk.core.persistence.DefaultPersistenceProviderFactory { *; }

// Required for the usage of annotations across reporter and web modules
-dontwarn com.fasterxml.jackson.annotation.JsonIgnore
-dontwarn com.squareup.moshi.Json
-dontwarn com.fasterxml.jackson.annotation.JsonProperty

// Required for Device Mode Transformations
-keep class com.rudderstack.android.sdk.core.TransformationResponse { *; }
-keep class com.rudderstack.android.sdk.core.TransformationResponseDeserializer { *; }
-keep class com.rudderstack.android.sdk.core.TransformationRequest { *; }

چگونه بعد از فراخوانی identify به اطلاعات کاربر (traits) دسترسی داشته باشم؟

پس از اجرای متد identify، می‌توانید اطلاعات traits کاربر را از context فعلی SDK دریافت کنید:

const rudderContext = await rudderClient.getRudderContext();
console.log('Traits are : ' + JSON.stringify(rudderContext.traits));

این اطلاعات شامل تمام ویژگی‌هایی است که هنگام فراخوانی identify برای کاربر ثبت کرده‌اید.


Zebline React Native SDK با رویدادهای بزرگ‌تر از ۳۲KB چگونه برخورد می‌کند؟

Zebline React Native SDK به‌صورت پیش‌فرض، هر رویدادی که حجم آن بیشتر از ۳۲KB باشد را ارسال نمی‌کند و آن رویداد drop می‌شود.