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 بررسی کنید.
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 برای 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 به پروژه:
- به ریشه (Root) پروژه React Native خود بروید.
- پکیج SDK را به عنوان dependency به پروژه اضافه کنید.
npm install @rudderstack/rudder-sdk-react-native --save
اگر از yarn استفاده میکنید، میتوانید از دستور معادل آن نیز استفاده کنید.
نام پکیج فنی 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);
}, []);
استفاده از await در متد setup بسیار مهم است تا اطمینان حاصل شود SDK قبل از ارسال هرگونه رویداد بهدرستی مقداردهی شده است.
۴) امضای متد setup
| نام پارامتر | نوع داده | اجباری | توضیح |
|---|---|---|---|
| writeKey | String | بله | Write Key مربوط به سورس React Native در Zebline |
| configuration | Object | خیر | شامل تنظیمات کلاینت 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
- فایل
gradle.propertiesرا در ریشه پروژه Android باز کنید. - مقدار فلگ
newArchEnabledرا برابر باtrueقرار دهید.
newArchEnabled=true
برای غیرفعالسازی معماری جدید:
newArchEnabled=false
مرحله ۵: پیکربندی کلاینت Zebline SDK
شما میتوانید رفتار Zebline React Native SDK را با ارسال پارامترهای مختلف در آبجکت configuration هنگام فراخوانی متد setup کنترل کنید.
لیست پارامترهای قابل پیکربندی
| پارامتر | نوع | توضیح | مقدار پیشفرض |
|---|---|---|---|
| logLevel | int | تعیین میزان لاگهای تولیدشده توسط SDK. برای مشاهده مقادیر قابل پشتیبانی به بخش Debugging مراجعه کنید. | RUDDER_LOG_LEVEL.ERROR |
| dataPlaneUrl | string | آدرس Data Plane مربوط به ورکاسپیس Zebline | https://analytics.zebline.com |
| flushQueueSize | int | تعداد رویدادها در هر batch ارسالی به سرور | 30 |
| dbCountThreshold | int | حداکثر تعداد رویدادهای ذخیرهشده در دیتابیس SQLite. پس از رسیدن به این حد، رویدادهای قدیمی حذف میشوند. | 10000 |
| sleepTimeOut | int | حداقل زمان انتظار برای ارسال رویدادها به سرور | 10 ثانیه |
| configRefreshInterval | int | بازه زمانی (به ساعت) برای دریافت مجدد تنظیمات از داشبورد Zebline | 2 |
| autoSessionTracking | boolean | فعالسازی ردیابی خودکار سشن کاربران | true |
| sessionTimeout | int | حداکثر زمان عدم فعالیت قبل از پایان سشن | 300000 ms (5 دقیقه) |
| trackAppLifecycleEvents | boolean | ثبت خودکار رویدادهای چرخه حیات اپلیکیشن | true |
| enableBackgroundMode | boolean | ارسال رویدادها برای مدت کوتاه قبل از بسته شدن یا رفتن اپلیکیشن به پسزمینه (فقط iOS و tvOS) | false |
| enableGzip | boolean | فشردهسازی (Gzip) درخواستهای ارسالی | true |
| autoCollectAdvertId | boolean | جمعآوری خودکار Advertising ID | false |
| recordScreenViews | boolean | ثبت خودکار Screen View | false |
| dbEncryption | DBEncryption | فعالسازی رمزنگاری دیتابیس با کلید مشخصشده | - |
| controlPlaneUrl | string | آدرس Control Plane در صورت استفاده از نسخه Open-source | https://c.zebline.com |
بیشتر پروژهها تنها به تنظیم dataPlaneUrl و در صورت نیاز logLevel احتیاج دارند و سایر پارامترها اختیاری هستند.
مرحله ۶: فشردهسازی درخواستها با Gzip
قابلیت Gzip در Zebline React Native SDK این امکان را فراهم میکند که درخواستهای ارسالی رویدادها بهصورت فشرده ارسال شوند. این کار باعث کاهش حجم داده ارسالی و بهبود عملکرد شبکه میشود.
قابلیت 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,
});
در اغلب سناریوها، توصیه میشود قابلیت Gzip فعال باقی بماند؛ مگر در شرایط خاص مانند محدودیتهای سرور یا عیبیابی (Debug).
مرحله ۷: شناسایی کاربر (Identify)
متد identify در Zebline React Native SDK برای شناسایی یک کاربر و اتصال او به رفتارها و رویدادهای ثبتشده استفاده میشود. با استفاده از این متد میتوانید اطلاعاتی مانند نام، ایمیل، موقعیت جغرافیایی و سایر ویژگیها (Traits) را برای کاربر ذخیره کنید.
نمونه استفاده از identify
rudderClient.identify(
"test_userId",
{
email: "testuser@example.com",
location: "UK",
},
null
);
امضای متد identify
| نام پارامتر | نوع داده | اجباری | توضیح |
|---|---|---|---|
| userId | String | بله | شناسه یکتای کاربر |
| traits | Object | خیر | اطلاعات و ویژگیهای کاربر (Traits) |
| option | Object | خیر | تنظیمات اضافی برای رویداد identify |
پس از شناسایی کاربر، Zebline SDK اطلاعات کاربر را ذخیره کرده و آنها را به تمام فراخوانیهای بعدی مانند track یا screen اضافه میکند.
در صورتی که نیاز به حذف اطلاعات شناسایی کاربر داشته باشید، میتوانید از متد reset استفاده کنید.
بهتر است متد 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 دارای امضای زیر است:
| نام پارامتر | نوع داده | اجباری | توضیح |
|---|---|---|---|
name | String | بله | نام رویداد ثبتشده |
property | Object | خیر | دادهها و Propertyهای اضافی مرتبط با رویداد |
options | Object | خیر | تنظیمات و گزینههای اضافی برای رویداد |
ردیابی خودکار رویدادهای چرخه عمر اپلیکیشن
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 از امضای زیر نیز پشتیبانی میکند:
| نام پارامتر | نوع داده | اجباری | توضیح |
|---|---|---|---|
screenName | String | بله | نام صفحهای که کاربر مشاهده کرده است |
property | Object | خیر | Propertyهای اضافی که همراه با Screen Event ارسال میشوند |
option | Object | خیر | تنظیمات و گزینههای اضافی برای رویداد 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 دارای امضای زیر است:
| نام پارامتر | نوع داده | اجباری | توضیح |
|---|---|---|---|
groupId | String | بله | شناسه یکتای Group |
traits | Object | خیر | ویژگیها و مشخصات Group |
option | Object | خیر | تنظیمات و گزینههای اضافی برای رویداد 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 را نشان میدهد:
| نام پارامتر | نوع داده | توضیح |
|---|---|---|
newId | String | شناسه جدید (userId) که باید به کاربر اختصاص داده شود (الزامی) |
previousId | String | شناسه قبلی کاربر (اختیاری) |
options | Object | Optionهای سطح رویداد |
رفتار 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 پارامترهای زیر را میپذیرد:
| پارامتر | نوع | توضیح |
|---|---|---|
key | string | کلید مورد استفاده برای رمزنگاری و رمزگشایی دیتابیس |
enable | boolean | تعیین میکند که رمزنگاری فعال یا غیرفعال باشد |
غیرفعالسازی رمزنگاری دیتابیس
برای حذف رمزنگاری، کافی است مقدار 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 را لینک کند.
مراحل انجام کار
- تنظیمات Project-level Build Settings را باز کنید (نه Target-level).
- گزینه Other Linker Flags را پیدا کنید.
- بسته به نحوه استفاده شما از 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
| نام پارامتر | نوع داده | اجباری | توضیح |
|---|---|---|---|
destinationName | string | بله | نام نمایشی مقصد در حالت Device-mode |
callback | Function | بله | تابعی که پس از موفقیت یکپارچهسازی اجرا میشود |
فیلتر کردن رویدادها (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)
آیا لازم است SDK را با React Native link کنم؟
خیر، نیازی به 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 میشود.