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

نویسنده: IT Sectr منتشر شده: 2026-06-06 زمان مطالعه: 9 دقیقه

توسعه بین‌پلتفرمی یکی از پویاترین حوزه‌های مهندسی موبایل است. طبق Statista (2025)، 42٪ از توسعه‌دهندگان موبایل از Flutter یا React Native در پروژه‌های خود استفاده می‌کنند. کانال‌های پلتفرم، پل‌ها و ماژول‌های بومی اساس معماری بین‌پلتفرمی هستند.

نکات کلیدی

  • Flutter از Platform Channel (MethodChannel) برای ارتباط با کد بومی استفاده می‌کند. پیام‌ها به فرمت باینری سریالایز و به صورت ناهمگام ارسال می‌شوند.
  • React Native از Bridge (معماری قدیم) و Fabric (جدید) استفاده می‌کند. Fabric از JSI برای فراخوانی همگام توابع بومی استفاده می‌کند.
  • Kotlin Multiplatform از expect/actual — اعلان و پیاده‌سازی پلتفرم استفاده می‌کند. Kotlin/Native کد را مستقیماً به باینری iOS کامپایل می‌کند.
  • ابزارهای ساخت برای توسعه بین‌پلتفرمی: Gradle KTS (Kotlin DSL برای Gradle)، CocoaPods Plugin (مدیریت وابستگی‌های iOS)، XCFramework (توزیع کتابخانه‌های بومی).
  • Skia (Flutter) و Impeller — موتورهای رندر. Impeller جدیدتر، سریع‌تر است و مشکلات jank را در دستگاه‌های قدیمی حل می‌کند.

توسعه بین‌پلتفرمی: Flutter Platform Channel و Method Channel

Flutter فریمورک گوگل برای ایجاد اپلیکیشن‌های بومی از یک پایگاه کد Dart است. برای تعامل با کد پلتفرم (Kotlin, Swift)، Flutter از Platform Channel استفاده می‌کند. این پلی است که کد Dart از طریق آن توابع بومی را فراخوانی کرده و نتیجه را دریافت می‌کند. توسعه اپلیکیشن موبایل بین‌پلتفرمی با Flutter سریع‌ترین بخش در حال رشد توسعه موبایل در 2025–2026 است.

Platform Channel (Method Channel)

Method Channel کانال اصلی ارتباط Flutter <-> بومی است. در سمت Dart: MethodChannel('com.example/channel').invokeMethod('getBatteryLevel'). پیام در StandardMethodCodec (باینری) کدگذاری می‌شود. در سمت بومی، MethodChannel ثبت شده و فراخوانی را پردازش می‌کند. MethodChannel ناهمگام است — نتیجه از طریق Future برگردانده می‌شود. جایگزین: EventChannel برای جریان رویدادها.

BasicMessageChannel کانال سطح پایین‌تری برای ارسال رشته‌ها/بایت‌ها بدون ساختار "متد-آرگومان" است. برای پروتکل‌های سفارشی استفاده می‌شود. تمام API Platform Channel از Flutter Engine عبور می‌کند که پیام‌ها را سریالایز/دیسریالایز می‌کند.

FFI، Skia و Impeller

dart:ffi (Foreign Function Interface) — فراخوانی مستقیم توابع C از Dart بدون کانال‌های پلتفرم. FFI سریع‌تر از Method Channel است (0 سربار سریالایز). برای عملیات‌های سنگین استفاده می‌شود: پردازش صدا، رمزنگاری، موتورهای گرافیکی. Skia موتور رندر Flutter است (گرافیک 2D). Impeller موتور رندر جدید Flutter است که جایگزین Skia می‌شود. Impeller شیدرها را از پیش کامپایل می‌کند (Ahead-of-Time)، که jank (لرزش فریم) را در راه‌اندازی‌های اول حذف می‌کند. در IT Sectr ما در سال 2025 به Impeller مهاجرت کردیم — تفاوت در نرمی انیمیشن‌ها بلافاصله قابل مشاهده است.

توسعه بین‌پلتفرمی با React Native: Bridge, Fabric, Hermes, JSI

React Native فریمورک متا برای توسعه اپلیکیشن موبایل بین‌پلتفرمی در JavaScript/TypeScript است. React Native کامپوننت‌ها را به عناصر UI بومی رندر می‌کند. معماری تکامل یافته است: Bridge قدیمی → Fabric جدید با JSI.

Fabric در مقابل Bridge

Bridge معماری قدیمی React Native است. رشته JS پیام‌ها را به JSON سریالایز کرده و از طریق صف ناهمگام به رشته بومی می‌فرستد. این باعث تأخیر می‌شود (round-trip پل ~1 میلی‌ثانیه). Fabric معماری جدیدی است که در آن رشته‌های JS و UI بومی به صورت همگام از طریق JSI (JavaScript Interface) ارتباط برقرار می‌کنند. Fabric ویوهای بومی را مستقیماً و بدون پل تزریق می‌کند. Fabric نقطه عطفی در توسعه بین‌پلتفرمی است و رندر را تا 2 برابر加速 می‌کند.

JSI (JavaScript Interface) یک API C++ است که به JavaScript اجازه می‌دهد مستقیماً توابع بومی را فراخوانی کرده و حافظه را به اشتراک بگذارد. JSI جایگزین سریالایز JSON در Bridge شد. معماری جدید مبتنی بر JSI دستاورد مهمی در توسعه بین‌پلتفرمی است که عملکرد اپلیکیشن‌های موبایل را تعیین می‌کند. Turbo Module روش جدیدی برای نوشتن ماژول‌های بومی برای React Native است. برخلاف Native Modules قدیمی، Turbo Module به صورت تنبل بارگذاری می‌شود و از JSI استفاده می‌کند.

Hermes و Codegen

Hermes یک موتور JavaScript از متا است که برای React Native بهینه شده است. Hermes کد JS را در زمان ساخت به بایت‌کد کامپایل می‌کند، راه‌اندازی اپلیکیشن موبایل را تسریع کرده و مصرف حافظه را در توسعه بین‌پلتفرمی کاهش می‌دهد. Codegen یک تولیدکننده کد بومی بر اساس انواع TypeScript است. Codegen به طور خودکار ماژول‌های بومی و اتصالات JSI را ایجاد می‌کند و کار دستی را کاهش می‌دهد.

پارامتر Flutter React Native KMP
زبانDartJavaScript/TypeScriptKotlin
معماریSkia/Impeller (رندر سفارشی)Fabric + JSI (UI بومی)SDK بومی (هر ماژول)
پل بومیMethodChannel (Dart ↔ بومی)JSI (JS ↔ C++ ↔ بومی)expect/actual (Kotlin ↔ بومی)
UIسفارشی (Skia/Impeller)کامپوننت‌های بومی (UIKit/Android Views)UI بومی (Jetpack Compose, SwiftUI)
موتور رندرSkia یا Impellerبومی (UIView/View)بومی

Flutter همه چیز را خود از طریق Skia/Impeller رندر می‌کند — این یک UI یکپارچه در هر دو پلتفرم می‌دهد. React Native از کامپوننت‌های UI بومی استفاده می‌کند — شبیه اپلیکیشن بومی به نظر می‌رسد. KMP UI را مدیریت نمی‌کند — فقط منطق کسب‌وکار را به اشتراک می‌گذارد، UI بومی باقی می‌ماند. انتخاب به اولویت بستگی دارد: UI یکپارچه (Flutter) یا حداکثر بومی‌بودن (React Native/KMP).

توسعه بین‌پلتفرمی با Kotlin Multiplatform: expect/actual, Kotlin/Native

Kotlin Multiplatform (KMP) فناوری JetBrains برای کد مشترک بین Android و iOS است. برخلاف Flutter و React Native، KMP رویکردی جایگزین برای توسعه بین‌پلتفرمی است: UI را جایگزین نمی‌کند، بلکه منطق کسب‌وکار، درخواست‌های شبکه، مدل‌های داده و مخازن را به اشتراک می‌گذارد. UI بومی می‌ماند: Jetpack Compose برای Android، SwiftUI برای iOS.

expect/actual

expect — اعلان یک تابع یا کلاس در ماژول مشترک (commonMain) که پیاده‌سازی پلتفرمی دارد. توسعه بین‌پلتفرمی با KMP از expect/actual استفاده می‌کند: actual پیاده‌سازی مشخص برای هر پلتفرم (androidMain, iosMain) است. مثال: expect fun getDeviceId(): String — actual در Android از Settings.Secure استفاده می‌کند، در iOS — UIDevice.current.identifierForVendor.

Kotlin/Native

Kotlin/Native — کامپایلر Kotlin به باینری بومی (فریمورک iOS). این امکان اجرای کد Kotlin در iOS بدون JVM را فراهم می‌کند. Kotlin/Native از LLVM برای کامپایل استفاده می‌کند و عملکرد نزدیک به Swift ارائه می‌دهد. Kotlin/JS — کامپایل Kotlin به JavaScript برای پروژه‌های وب و React Native.

ابزارهای ساخت: Gradle KTS, CocoaPods Plugin, XCFramework

ابزارهای ساخت توسعه اپلیکیشن موبایل بین‌پلتفرمی — پل بین کد و باینری نهایی. Gradle KTS بخش Android را مدیریت می‌کند، CocoaPods Plugin وابستگی‌های iOS KMP را مدیریت می‌کند، XCFramework توزیع کتابخانه‌های بومی را مدیریت می‌کند.

Gradle KTS

Gradle KTS — پیکربندی Gradle با استفاده از Kotlin DSL به جای Groovy. KTS از تکمیل خودکار در Android Studio، بررسی نوع و امنیت بازآرایی پشتیبانی می‌کند. مثال: plugins { id("com.android.application") } به جای apply plugin: 'com.android.application'. برای همه پروژه‌های جدید توصیه می‌شود.

CocoaPods Plugin و XCFramework

CocoaPods Plugin — افزونه Gradle برای KMP که ماژول مشترک را به عنوان pod CocoaPods منتشر می‌کند. توسعه‌دهنده iOS آن را از طریق Podfile اضافه می‌کند. XCFramework — فرمت توزیع کتابخانه‌های باینری اپل. XCFramework حاوی باینری‌هایی برای چندین معماری (arm64, x86_64) و پلتفرم (iOS, macOS, watchOS) است. در KMP ماژول مشترک به عنوان XCFramework برای iOS صادر می‌شود.

سوالات متداول

در سال 2026 چه چیزی را انتخاب کنیم: Flutter یا React Native؟

Flutter عملکرد بهتر (Skia/Impeller)، پایگاه کد UI واحد و پایداری بالا در توسعه بین‌پلتفرمی ارائه می‌دهد. React Native — جامعه بزرگ، انتقال آسان از توسعه وب و انعطاف‌پذیری از طریق JSI. IT Sectr برای پروژه‌های متمرکز بر UI، Flutter و اگر پروژه به کد بومی مکرر نیاز دارد، React Native را توصیه می‌کند.

Flutter چگونه از طریق Platform Channel با کد بومی ارتباط برقرار می‌کند؟

Flutter پیامی را از طریق MethodChannel در سمت Dart ارسال می‌کند. پیام به فرمت باینری کدگذاری شده و به سمت بومی (Kotlin/Swift) منتقل می‌شود، جایی که پردازش شده و نتیجه را برمی‌گرداند. تمام ارتباطات در توسعه اپلیکیشن موبایل ناهمگام است.

expect/actual در Kotlin Multiplatform چیست؟

expect اعلان یک تابع یا کلاس در کد مشترک است که پیاده‌سازی پلتفرمی دارد. actual پیاده‌سازی مشخص برای هر پلتفرم (Android/iOS) است. این مکانیسم KMP برای کامپایل شرطی بدون پیش‌پردازنده است.

تفاوت بین Fabric و Bridge در React Native چیست؟

Bridge معماری قدیمی است که در آن پیام‌ها به JSON سریالایز شده و به صورت ناهمگام از طریق صف منتقل می‌شوند. Fabric معماری جدید با فراخوانی همگام توابع بومی از طریق JSI است که تأخیرها را حذف کرده و عملکرد اپلیکیشن موبایل را بهبود می‌بخشد.

Hermes چیست و چرا React Native به آن نیاز دارد؟

Hermes یک موتور JavaScript از متا است که برای React Native بهینه شده است. JS را در زمان ساخت به بایت‌کد کامپایل می‌کند، راه‌اندازی اپلیکیشن را 2–3 برابر سریع‌تر کرده و مصرف حافظه را کاهش می‌دهد.

خلاصه

  • Flutter از Platform Channel (MethodChannel) برای ارتباط با کد بومی استفاده می‌کند. FFI — برای فراخوانی مستقیم توابع C بدون سربار.
  • React Native از Bridge به Fabric + JSI مهاجرت کرده است. JSI امکان فراخوانی همگام توابع بومی را فراهم می‌کند و تأخیرهای پل را حذف می‌کند.
  • Kotlin Multiplatform برای کد پلتفرم از expect/actual استفاده می‌کند. Kotlin/Native کد مشترک را به فریمورک بومی iOS کامپایل می‌کند.
  • توسعه اپلیکیشن موبایل بین‌پلتفرمی با Flutter از Skia/Impeller، با React Native — JSI/Fabric، با KMP — expect/actual برای کد بومی استفاده می‌کند.
  • Hermes — موتور JS برای React Native. راه‌اندازی را تسریع کرده و مصرف حافظه را کاهش می‌دهد.
  • Gradle KTS — Kotlin DSL برای Gradle. CocoaPods Plugin و XCFramework — برای توزیع باینری‌های iOS در توسعه بین‌پلتفرمی.
  • انتخاب فریمورک: Flutter برای UI یکپارچه، React Native برای UI بومی با JS، KMP برای اشتراک منطق کسب‌وکار با UI بومی.
  • هنگام انتخاب فناوری توسعه اپلیکیشن موبایل بین‌پلتفرمی، الزامات عملکرد و اندازه تیم را در نظر بگیرید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه