مینی‌اپ‌ها در بله

با مینی‌اپ‌ها، می‌توانید قدرت و امکانات صفحات وب را به بازوهای خود بیاورید و رابط‌های کاربری پویا و انعطاف‌پذیری طراحی کنید که مستقیماً در بله اجرا شده و تجربه‌ای یکپارچه و روان برای کاربران فراهم می‌کنند. این مینی اپ‌ها می‌توانند به‌طور کامل جایگزین وب‌سایت‌ها شوند و امکان تعامل پیشرفته‌تری را در محیط بله ارائه دهند.

مثال‌ها

برای دانلود یک نمونه مثال از نحوه‌ی کار با sdk مینی‌اپ، اینجا (opens in a new tab) کلیک کنید.

راهنمای طراحی

این راهنما، به هدف یکپارچگی بیشتر مینی‌اپ‌ها، ارائه یک تجربهٔ خوب به کاربران و در نتیجه بالا رفتن تعداد کاربر بازو در نظر گرفته شده است. در طراحی مینی‌اپ‌ها به این نکات توجه کنید:

  • همه عناصر موجود در مینی‌اپ باید پاسخگو (Responsive) باشند. به این معنی که با ابعاد دستگاه‌های مختلف (موبایل، تبلت، لپ‌تاپ) هماهنگ بوده و کاربران بدون توجه به بزرگ یا کوچک بودن نمایشگر، بتوانند به‌راحتی و به‌طور کامل مینی‌اپ را ببینند.
  • عناصر موجود در مینی‌اپ با رویکرد موبایل محور (mobile-first) طراحی شوند. به این معنی که ابتدا با در نظر گرفتن صفحۀ نمایش کوچکتر (موبایل) طراحی کنید و توسعه دهید و بعد از آن برای صفحه‌های نمایش بزرگ‌تر طراحی کنید (وب و …).
  • در صورت استفاده از انیمیشن، باید روان و در حالت ایده‌آل ۶۰ فریم بر ثانیه باشند. انیمیشن‌ها و جلوه‌های بصری را در دستگاه‌های با کارایی پایین به حداقل برسانید تا از عملکرد روان مینی‌اپ در آن دستگاه‌ها اطمینان داشته باشید.
  • در انتخاب رنگ عناصر مینی‌اپ به تم تیره و روشن دستگاه کاربر توجه شود.
  • عرض دکمهٔ مینی‌اپ در اینپوت بار بازو برای اندروید حداکثر می‌تواند ۲۰ کاراکتر باشد.
  • در صفحه‌های داخلی دکمهٔ «بازگشت» فراموش نشود.
  • خطاهایی که ممکن است به کاربر نشان داده شود، را در نظر بگیرید (Error Handling). متن خطا باید گویا و قابل فهم باشد و کاربر را برای اقدام بعدی راهنمایی کند.

دسترسی به مینی‌اپ‌ها

در حال حاضر از سه روش برای اجرای مینی اپ‌ها در بله پشتیبانی می‌کنیم؛ دکمه منوی بازو، دکمه اینلاین (opens in a new tab) و دکمه صفحه‌کلید ریپلای (opens in a new tab).

accessing mini apps

مینی‌اپ در دکمه منو بازو

در گفتگوی شخصی با بازوها، همیشه دکمه‌ای کاربردی کنار نوار ورودی قرار دارد که دسترسی سریع به دستورهای بازو را فراهم می‌کند. با مراجعه به @botfather (opens in a new tab) می‌توانید عملکرد این دکمه را تغییر دهید تا پیوند ثابتی را در قالب مینی‌اپ باز کند و متن دلخواه شما را نمایش دهد.

مینی‌اپ در پیام‌ها

با استفاده از فیلد web_app در InlineKeyboardButton (opens in a new tab) می‌توانید هر پیوندی را در دکمه زیر پیام‌ها قرار دهید تا در قالب مینی‌اپ باز شود.

همچنین با استفاده از فیلد مشابه web_app در KeyboardButton (opens in a new tab) می‌توانید هر پیوندی را در دکمه صفحه‌کلید، همراه پیام‌ها قرار دهید تا در قالب مینی‌اپ باز شود.

پیاده‌سازی مینی‌اپ‌ها

همانطور که گفته شد، مینی‌اپ‌ها قابلیت استفاده از تمام امکانات صفحات وب را دارا هستند. این قابلیت‌ها حتی شامل مواردی مانند کسب اجازه برای دسترسی به میکروفون، دوربین و موقعیت مکانی می‌باشند. اما ويژگی اصلی مینی‌اپ، ارتباط با اپلیکیشن بله و تعامل با کاربرها از طریق آن می‌باشد. برای برقراری ارتباط مینی‌اپ‌تان با کلاینت بله، script زیر را قبل از هر script دیگری در ابتدای <head> فایل اصلی html خود قرار دهید:

<script src="https://tapi.bale.ai/miniapp.js?2"></script>

با اجرای این کد، شیء window.Bale.WebApp با ویژگی‌هایی که در ادامه توضیح داده شدند، ایجاد خواهد شد.

WebApp

فیلدنسخهنوعتوضیحات
initData1.0Stringیک رشته که حاوی داده خام ارسال شده به مینی‌اپ است و می‌توان از آن برای اعتبارسنجی داده‌ها استفاده کرد.
initDataUnsafe1.0WebAppInitDataشی‌ای شامل داده‌های ورودی منتقل‌شده به مینی اپ.
هشدار: این داده‌ها را تنها پس از اعتبارسنجی در سرور بازو استفاده کنید، زیرا ممکن است دارای مقادیر قدیمی یا جعلی باشند.
version1.0Stringنسخه‌ای از API مینی‌اپ که کلاینت کاربر از آن پشتیبانی می‌کند.
isIframe1.0Booleanنشان‌دهنده‌ پلتفرمی که از طریق آن مینی‌اپ باز شده است. اگر true باشد یعنی از وب باز شده است و اگر false باشد، یعنی از اندروید باز شده است
themeParams1.0ThemeParamsشی‌ای شامل اطلاعات تم استفاده‌شده فعلی در اپلیکیشن بله.
isClosingConfirmationEnabled1.0Booleanمقدار true اگر دیالوگ تأیید برای بستن مینی اپ فعال باشد، مقدار false اگر غیرفعال باشد.
BackButton1.0BackButtonآبجکتی برای کنترل دکمه برگشت که می‌تواند در هدر مینی‌اپ در رابط کاربری بله نمایش داده شود.
SettingsButton1.0SettingsButtonآبجکتی برای کنترل گزینه‌ی تنظیمات در منوی زمینه‌ی مینی‌اپ در رابط کاربری بله.
isDarkMode1.0Booleanنشان‌دهنده‌ی تاریک بودن یا نبودن تم کاربر در اپلیکیشن بله است.
colorScheme1.0Stringنشان‌دهنده‌ی تم کاربر در اپلیکیشن بله است؛ مقدار light برای تم روشن و dark برای تم تاریک.

متدها

در این قسمت تمام متدهایی قابل استفاده شیء WebApp توضیح داده شده است. این متدها به شما این امکان را می‌دهند که بتوانید با اپلیکیشن بله و خارج از مینی‌اپ خود، ارتباط برقرار کنید. همچنین در نتیجه‌ی صدا زدن این متدها ممکن است برخی از Eventها رخ بدهند. اگر اپلیکیشن کاربر نسخه پایینتری از مینی‌اپ را داشته باشد، با صدا زدن متد مربوط به نسخه بالاتر، اتفاقی نخواهد افتاد.

نامنسخهتوضیحات
openLink(url[options])1.0با این متد می‌توانید یک پیوند را در مرورگر داخلی بله یا مرورگر پیش‌فرض دستگاه کاربر باز کنید.
اگر پارامتر اختیاری options دارای فیلد try_instant_views با مقدار true باشد، پیوند در مرورگر داخلی بله باز می‌شود.
addToHomeScreen()1.0متدی برای نمایش درخواست اضافه کردن میانبر مینی‌اپ به صفحه اصلی دستگاه.
checkHomeScreenStatus([callback])1.0این متد بررسی می‌کند که آیا امکان افزودن میانبر مینی‌اپ به صفحه اصلی وجود دارد یا نه. همچنین بررسی می‌کند که میانبر قبلاً به صفحه اصلی اضافه شده است یا خیر. اگر تابع callback به عنوان پارامتر اختیاری داده شده باشد، با یک آرگومان status فراخوانی می‌شود که یک رشته حاوی وضعیت صفحه اصلی است. مقادیر ممکن برای status عبارتند از:
- unsupported – قابلیت افزودن میانبر به صفحه اصلی وجود ندارد.
- unknown – این قابلیت پشتیبانی می‌شود و امکان افزودن میانبر وجود دارد، اما نمی‌توان تعیین کرد که آیا میانبر قبلاً اضافه شده است یا خیر.
- added – میانبر قبلاً به صفحه اصلی اضافه شده است،
- missed – میانبر به صفحه اصلی اضافه نشده است.
requestContact([callback])1.0فراخوانی این متد یک دیالوگ به کاربر نمایش می‌دهد و از او درخواست دسترسی به شماره تلفن می‌کند. اگر پارامتر اختیاری callback داده شده باشد، تابع callback هنگام بسته شدن دیالوگ، فراخوانی می‌شود؛ آرگومان اول یک مقدار boolean خواهد بود که نشان می‌دهد آیا کاربر شماره تلفن خود را به اشتراک گذاشته است یا خیر.
enableClosingConfirmation()1.0متدی برای فعال‌سازی دیالوگ تأیید بستن مینی اپ.
disableClosingConfirmation()1.0متدی برای غیرفعال‌سازی دیالوگ تأیید بستن مینی اپ.
onEvent(eventType, eventHandler)1.0با استفاده از این متد می‌توانید برای دریافت رویدادهای مختلفی که مینی‌اپ دریافت می‌کند، یک یا چند تابع (eventHandler) ثبت کند. فهرست تمام رویدادها را می‌توانید اینجا مشاهده کنید.
offEvent(eventType, eventHandler)1.0متدی برای حذف یک event handler که قبلاً ثبت شده است.
ready()1.0این متد به بله اطلاع می‌دهد که مینی‌اپ آماده نمایش است. پس از فراخوانی این متد، حالت بارگذاری به اتمام رسیده و مینی‌اپ نمایش داده می‌شود. اگر این متد فراخوانی نشود، حالت بارگذاری تنها زمانی به اتمام می‌رسد که صفحه به طور کامل بارگیری شود.
توصیه می‌کنیم این متد را در سریع‌ترین زمان ممکن و پس از بارگیری تمام عناصر ضروری رابط کاربری، فراخوانی کنید. همچنین می‌توانید پس از فراخوانی این متد، بارگذاری شخصی‌سازی شده مینی‌اپ خود را نمایش دهید.
expand()1.0با فراخوانی این متد، مینی‌اپ در حالت تمام‌صفحه نمایش داده می‌شود.
close()1.0متدی برای بستن مینی‌اپ.
setHeaderColor(colorKey, color)1.1با این متد می‌توانید رنگ Header مینی‌اپ را با استفاده از کلیدهای رنگی پیشفرض (bg_color یا secondary_bg_color) یا رنگ دلخواه hex (در فرمت RRGGBB#) تنظیم کنید.
showScanQrPopup(data)1.2اسکنر QR را باز می‌کند.
هنگامی که اسکنر QR را می‌خواند، ایونت qrTextReceived را ارسال می‌کند.
هنگامی که اسکنر بسته می‌شود، ایونتscanQrPopupClosed را ارسال می‌کند.
sendData(data)1.2با فراخوانی این متد data در قالب آپدیت یک پیام با فیلد web_app_data (opens in a new tab) به بازو ارسال می‌شود. دیتای ارسال شده حداکثر می‌تواند ۴۰۹۶ بایت باشد.
⚠️ توجه: بعد از فراخوانی این متد مینی‌اپ بسته می‌شود.

Header

header

WebAppInitData

این شیء حاوی داده‌ای است که هنگام باز شدن مینی‌اپ به آن ارسال می‌شود.

فیلدنوعتوضیحات
query_idStringشناسه‌‌ای یکتا برای نشست مینی اپ.
userWebAppUserشی‌ای شامل اطلاعات مربوط به کاربر فعلی.
auth_dateIntegerزمان باز شدن مینی‌اپ در قالب Unix
hashStringمقدار hash شده کل داده ارسالی. می‌توانید از آن برای اعتبارسنجی داده در سرور بازو استفاده کنید.

WebAppUser

این شیء حاوی داده کاربری است که از مینی‌اپ استفاده می‌کند.

فیلدنوعتوضیحات
idIntegerشناسه‌ی یکتای کاربر.
first_nameStringنام کاربر در بله.
usernameStringاختیاری. نام کاربری کاربر در بله.
allows_write_to_pmBooleanاختیاری. مقدار true اگر این کاربر اجازه‌ی ارسال پیام توسط بازو به خود را داده باشد.
photo_urlStringاختیاری. آدرس عکس پروفایل کاربر. این عکس می‌تواند در قالب jpeg یا svg باشد.

ThemeParams

مینی‌اپ‌ها می‌توانند ظاهر رابط کاربری خود را مطابق تنظیمات کاربر در اپلیکیشن بله قرار دهند. این شیء حاوی داده تم فعلی کاربر در بله است.

فیلدنوعتوضیحات
bg_colorStringاختیاری. رنگ پس‌زمینه در قالب #RRGGBB.
text_colorStringاختیاری. رنگ متن اصلی در قالب #RRGGBB.
برای استفاده در متن‌های بدنه (تیترها، پاراگراف‌ها، فهرست‌ها)
hint_colorStringاختیاری. رنگ متن راهنما در قالب #RRGGBB.
برای استفاده در متن‌های Placeholder (مثلاً در ورودی‌ها)، توضیحات فرعی و زیرنویس‌های کمرنگ.
link_colorStringاختیاری. رنگ پیوند در قالب #RRGGBB.‌
برای استفاده در پیوندها و متن‌های قابل کلیک
button_colorStringاختیاری. رنگ دکمه در قالب #RRGGBB.
برای استفاده در پس زمینه دکمه‌های اصلی مثل دکمه‌های تأیید
button_text_colorStringاختیاری. رنگ متن دکمه در قالب #RRGGBB.
برای استفاده در متن روی دکمه‌های رنگی.
secondary_bg_colorStringاختیاری. رنگ پس‌زمینه‌ی ثانویه در قالب #RRGGBB.
برای استفاده در پس‌زمینه کارت‌ها و بخش‌های جدا شده از پس‌زمینه اصلی.
header_bg_colorStringاختیاری. رنگ پس‌زمینه‌ی header در قالب #RRGGBB.
برای استفاده در نوار بالایی صفحات.
bottom_bar_bg_colorStringاختیاری. رنگ پس‌زمینه‌ی نوار پایینی در قالب #RRGGBB.
برای استفاده در بخش‌های ثابت پایین صفحه.
accent_text_colorStringاختیاری. رنگ متن تأکیدی در قالب #RRGGBB.
برای استفاده در متن‌های هایلایت شده و عناصر متنی با اهمیت بالا.
section_bg_colorStringاختیاری. رنگ پس‌زمینه‌ی بخش در قالب #RRGGBB.
برای استفاده همراه با secondary_bg_color.
section_header_text_colorStringاختیاری. رنگ متن header بخش در قالب #RRGGBB.
برای استفاده در تیتر بخش‌ها (مثلاً تنظیمات حساب، اطلاعات پرداخت)
section_separator_colorStringاختیاری. رنگ جداکننده‌ی بخش در قالب #RRGGBB.
subtitle_text_colorStringاختیاری. رنگ متن زیرعنوان در قالب #RRGGBB.
destructive_text_colorStringاختیاری. رنگ متن برای اقدامات غیرقابل بازگشت (مثلاً حذف حساب) در قالب #RRGGBB.

theme_params.png

BackButton

این شیء، کنترل دکمه بازگشت در header رابط کاربری بله را بر عهده دارد و با استفاده از آن می‌توانید دکمه بستن را با دکمه بازگشت جایگزین کنید.

فیلدنوعتوضیحات
isVisibleBooleanنشان می‌دهد که آیا دکمه قابل مشاهده است یا نه. به‌طور پیش‌فرض برابر با false است.
onClick(callback)Functionاین متد یک eventHandler برای کلیک روی دکمه ثبت می‌کند. معادل Bale.WebApp.onEvent('backButtonClicked', callback)
offClick(callback)Functionاین متد eventHandler کلیک روی دکمه را غیر فعال می‌کند. معادل Bale.WebApp.offEvent('backButtonClicked', callback)
show()Functionمتدی برای فعال و قابل مشاهده‌کردن دکمه.
hide()Functionمتدی برای پنهان‌کردن دکمه.

تمامی این متدها شیء BackButton را برمی‌گردانند تا بتوان آنها را به صورت زنجیره‌ای استفاده کرد.

SettingsButton

این شیء وظیفه افزودن و کنترل گزینه تنظیمات را در منوی زمینه header در رابط کاربری بله را بر عهده دارد.

فیلدنوعتوضیحات
isVisibleBooleanنشان می‌دهد که آیا گزینه در منو قابل مشاهده است یا نه. به‌طور پیش‌فرض برابر با false است.
onClick(callback)Functionاین متد یک eventHandler برای کلیک روی گزینه ثبت می‌کند. معادل Bale.WebApp.onEvent('settingsButtonClicked', callback)
offClick(callback)Functionاین متد eventHandler کلیک روی گزینه را غیر فعال می‌کند. معادل Bale.WebApp.offEvent('settingsButtonClicked', callback)
show()Functionمتدی برای فعال و قابل مشاهده‌کردن گزینه تنظیمات در منوی زمینه.
hide()Functionمتدی برای پنهان‌کردن گزینه تنظیمات در منوی زمینه.

تمامی این متدها شیء SettingsButton را برمی‌گردانند تا بتوان آنها را به صورت زنجیره‌ای استفاده کرد.

اعتبارسنجی داده‌های دریافت‌شده از طریق مینی‌اپ

برای اعتبارسنجی داده‌های دریافت‌شده از طریق مینی‌اپ، باید داده موجود در فیلد Bale.WebApp.initData را به سرور بازو ارسال کنید. این داده‌ها به‌صورت یک رشته url encoded و شامل مجموعه‌ای از key-value ها هستند. انواع داده‌های پیچیده (مانند WebAppUser) به‌صورت JSON-serialized در این رشته قرار می‌گیرند.

برای اطمینان از صحت داده‌های دریافت‌شده، می‌توانید مقدار hash دریافت‌شده را با نمایش hexadecimal امضای HMAC-SHA-256 از data-check-string مقایسه کنید. کلید مورد استفاده در این امضا، امضای HMAC-SHA-256 از توکن بازو با رشته ثابت "WebAppData" است.

data-check-string شامل تمامی فیلدهای دریافت‌شده است که به ترتیب حروف الفبا مرتب شده‌اند و مانند مثال زیر در کنار یکدیگر قرار گرفته اند. از کاراکتر خط جدید ('\n', 0x0A) به‌عنوان جداکننده استفاده می‌شود.

auth_date=<auth_date>\nquery_id=<query_id>\nuser=<user>

شبه‌کد بررسی صحت داده‌ها:

data_check_string = ...
secret_key = HMAC_SHA256(<bot_token>, "WebAppData")
if (hex(HMAC_SHA256(data_check_string, secret_key)) == hash) {
  // data is sent from Bale
}

برای جلوگیری از استفاده از داده‌های قدیمی، می‌توانید مقدار auth_date را بررسی کنید. این مقدار زمان باز شدن مینی‌اپ را در قالب Unix (opens in a new tab) نشان می‌دهد.

Events

مینی‌اپ می‌تواند رویدادهایی را از کلاینت بله دریافت کند و با استفاده از متد Bale.WebApp.onEvent(eventType, eventHandler)، یک یا چند تابع را برای دریافت آن‌ها ثبت کند. داخل eventHandler، کلمه کلیدی this به Bale.WebApp اشاره می‌کند و مجموعه پارامترهای ارسال‌شده به آن بستگی به نوع رویداد دارد. در ادامه فهرستی از رویدادهای ممکن آورده شده است:

اسمنسخهتوضیح
backButtonClicked1زمانی رخ می‌دهد که دکمه بازگشت فشرده شود. eventHandler هیچ پارامتری دریافت نمی‌کند.
settingsButtonPressed1زمانی رخ می‌دهد که دکمه تنظیمات در منو فشرده شود. eventHandler هیچ پارامتری دریافت نمی‌کند.
contactRequested1زمانی رخ می‌دهد که شماره تلفن کاربر درخواست شود. eventHandler یک آبجکت دریافت می‌کند که شامل فیلد status با یکی از مقادیر زیر است:
- sent – کاربر شماره تلفن خود را با بات به اشتراک گذاشت.
- cancelled – کاربر این درخواست را رد کرد.
homeScreenChecked1.1بعد از بررسی وضعیت بودن یا نبودن در home screen رخ می دهد.
تابعی که به عنوان event handler پاس داده می‌شود، یک آبجکت با فیلد status دریافت می‌کند که مقادیر زیر را می‌تواند داشته باشد:
- unsupported: این ویژگی پشتیبانی نمی شود، و امکان اضافه کردن مینی‌اپ به home screen وجود ندارد.
- unknown: این ویژگی پشتیبانی می شود، و مینی‌اپ را می توان اضافه کرد، اما تعیین اینکه آیا مینی‌اپ قبلاً اضافه شده است، امکان پذیر نیست.
- added: مینی‌اپ قبلاً به صفحه اصلی اضافه شده است.
- missed: - مینی‌اپ به صفحه اصلی اضافه نشده است.
homeScreenAdded1.2زمانی رخ می دهد که مینی‌اپ با موفقیت به home screen اضافه شود. تابع eventHandler ای که پاس داده می‌شود، هیچی پارامتری دریافت نمی‌کند.
homeScreenFailed1.2زمانی رخ می دهد که مینی‌اپ به home screen نتوانست اضافه شود. تابع eventHandler ای که پاس داده می‌شود، هیچی پارامتری دریافت نمی‌کند
qrTextReceived1.2زمان رخ می‌دهد که ‌اسکنر ‌‌QR را می‌خواند.
تابعeventHandler یک آبجکت با فیلد data دریافت می‌کند. متن اسکن شده درون این فیلد قرار دارد.
scanQrPopupClosed1.2زمان رخ می‌دهد که ‌اسکنر ‌‌QR بدون اسکن کردن بسته شود.
eventHandler هیچ پارامتری دریافت نمی‌کند.

رفع اشکال مینی‌اپ در اپلیکیشن اندروید

برای تسهیل فرآیند توسعه و شناسایی سریع‌تر اشکالات در مینی اپ می‌توانید با فعال کردن قابلیت رفع اشکال (Debugging) به لاگ‌ها و خطاهای اپلیکیشن دسترسی پیدا کرده و مشکلات را به سرعت شناسایی کنید.

مراحل فعال‌سازی به شرح زیر است:

  • در تنظیمات اپلیکیشن بله، گزینه نسخه را نگه دارید و حالت ارسال لاگ را فعال کنید.

  • از بین گزینه‌ها، گزینه "فعال‌سازی رفع اشکال وب ویو" را انتخاب کنید.

  • در ادامه برای استفاده از این قابلیت این توضیحات (opens in a new tab) را مطالعه کنید.

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

مینی‌اپ‌ها در نسخه‌ وب بله از طریق iframe باز می‌شوند و ممکن است که وجود هدرهای مشخصی، مانع باز شدن مینی‌اپ شما در نسخه‌ وب شود. برای اطمینان از درست باز شدن مینی‌اپ در نسخه‌ وب، از برقرار بودن موارد زیر مطمئن شوید:

  • هدر Content Security Policy (CSP) با directiveای به اسم frame-src و مقدار https://*.bale.ai موجود باشد. برای مثال:
Content-Security-Policy: frame-src 'https://*.bale.ai';
  • هدر X-Frame-Options وجود نداشته باشد.