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

فصل چهارم را از این جا بخوانید.

فصل پنجم: توسعه چند پلتفرمی (Cross-Platform Development)

تصویر فصل پنجم کتاب
تصویر فصل پنجم کتاب


نویسنده: رابرت ویرکوس (Robert Virkus)

با وجود اینکه اندروید (Android) و آی‌او‌اس (iOS) تنها بازیگران اصلی هستند، چرا باید استفاده از یک چارچوب توسعه چند پلتفرمی (cross-platform development framework) را در نظر بگیرید؟ به این ترتیب حتی یک تیم کوچک می‌تواند به هر دو پلتفرم خدمات ارائه دهد. و حتی ممکن است به راحتی سایر فرم فاکتورها و رسانه‌ها مانند رایانه‌های شخصی، کنسول‌های بازی و وب‌سایت‌ها را هدف قرار دهید.

تفاوت‌های کلیدی بین پلتفرم‌ها

اگر می‌خواهید برنامه خود را در پلتفرم‌های مختلف ارائه دهید، باید بر برخی موانع غلبه کنید. غلبه بر برخی چالش‌ها آسان‌تر از سایرین است:

  • زبان برنامه‌نویسی: کاتلین (Kotlin) و جاوا (Java) برای اندروید، سوئیفت (Swift) برای آی‌او‌اس
  • رابط کاربری (UI) و تجربه کاربری (UX): سبک و الگوهای تعامل در هر پلتفرم متفاوت است.
  • ادغام با دسکتاپ/لانچر (Desktop/Launcher Integration): در آی‌او‌اس فقط می‌توانید یک نشان (badge) با یک عدد به نماد برنامه خود اضافه کنید، در حالی که در اندروید می‌توانید یک ویجت دسکتاپ کامل (full-blown desktop widget) اضافه کنید که ممکن است داده‌های دلخواه را نمایش دهد و از هر تصویری استفاده کند.
  • ادغام با صفحه قفل (Lock Screen Integration): باز هم، راه‌های مختلفی برای ادغام در صفحه قفل وجود دارد.
  • چند وظیفگی (Multitasking): اندروید و آی‌او‌اس گزینه‌های مختلفی برای اجرای سرویس‌های پس‌زمینه (background services) دارند.
  • پراکندگی (Fragmentation): اکوسیستم اندروید بسیار پراکنده است، آی‌او‌اس بسیار همگن‌تر است.
  • خدمات پلتفرم (Platform Services): مانند پوش (push)، خرید درون‌برنامه‌ای (in-app-purchase) و تبلیغات درون‌برنامه‌ای (in-app-advertisement) در هر پلتفرم متفاوت هستند.

مزایا و معایب چارچوب‌های چند پلتفرمی

با توجه به تفاوت‌های بالا، چرا باید استفاده از یک چارچوب چند پلتفرمی را در نظر بگیرید؟

  • استفاده مجدد از کد، پیچیدگی و در نتیجه منابع بالقوه باگ را کاهش می‌دهد.
  • داشتن عمدتاً یک منبع کد، زمان ورود به بازار و مقرون به صرفه بودن پروژه شما را نیز افزایش می‌دهد.
  • از برابری ویژگی‌ها (feature parity) بین پلتفرم‌ها لذت خواهید برد.
  • تیم شما به تخصص پلتفرم کمتری نیاز دارد و تشکیل آن آسان‌تر می‌شود.
  • استفاده از اجزای رابط کاربری یکسان منجر به سازگاری رابط کاربری (UI consistency) می‌شود که به نوبه خود تلاش برای پشتیبانی شما را کاهش می‌دهد.

با این حال:

  • برخی از ویژگی‌ها به ادغام‌های بومی (native integrations) نیاز دارند، در این صورت، پیچیدگی بیشتری دارید زیرا باید همزمان با چارچوب خود، کد خود و سیستم‌عامل هدف سروکار داشته باشید.
  • استفاده از رابط کاربری یکسان ممکن است منجر به کاهش تجربه کاربری شود که برای سیستم‌عامل هدف بهینه نیست.
  • بسته به چارچوب انتخاب شده، کد شما ممکن است کندتر از کد بومی باشد.
  • هنگامی که نسخه‌های جدید سیستم‌عامل با ویژگی‌های جدید وجود دارد، ممکن است لازم باشد منتظر بمانید تا چارچوب انتخابی شما به‌روز شود.

استراتژی‌های چند پلتفرمی

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

پشتیبانی مستقیم (Direct Support)

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

کتابخانه‌های مؤلفه (Component libraries) می‌توانند به شما در سرعت بخشیدن به توسعه بومی کمک کنند، مؤلفه‌های تجاری و منبع باز بسیاری برای همه پلتفرم‌ها در دسترس هستند.

اشتراک‌گذاری دارایی (Asset Sharing)

هنگامی که چندین تیم را برای پلتفرم‌های مختلف نگهداری می‌کنید، همچنان می‌توانید با اشتراک‌گذاری برخی از ساختارهای برنامه، تلاش زیادی را صرفه‌جویی کنید:

  • مفهوم و دارایی‌ها (Concept and assets): عمدتاً این کار را به طور خودکار انجام خواهید داد: ایده‌ها و مفاهیم برنامه، جریان رابط کاربری، ورودی و خروجی و طراحی و دارایی‌های طراحی برنامه را به اشتراک بگذارید (اما از نیاز به پشتیبانی از ساختارهای رابط کاربری خاص پلتفرم آگاه باشید).
  • ساختارهای داده و الگوریتم‌ها (Data structures and algorithms): با اشتراک‌گذاری ساختارهای داده و الگوریتم‌ها در بین پلتفرم‌ها یک قدم فراتر بروید.
  • اشتراک‌گذاری کد مدل کسب‌وکار (Codesharing of the business model): با استفاده از کامپایلرهای چند پلتفرمی (cross-platform compilers) می‌توانید مدل کسب‌وکار را نیز بین پلتفرم‌ها به اشتراک بگذارید. روش دیگر، می‌توانید از یک مفسر (interpreter) یا یک ماشین مجازی (virtual machine) و یک زبان مشترک در انواع پلتفرم‌ها استفاده کنید.
  • انتزاع کامل (Complete abstraction): برخی از ابزارهای چند پلتفرمی به شما امکان می‌دهند مدل کسب‌وکار، نما (view) و کنترل (control) برنامه خود را برای پلتفرم‌های مختلف کاملاً انتزاعی کنید.

پِلِیِر و ماشین‌های مجازی (Player And Virtual Machines)

مفاهیم پِلِیِر (Player concepts) معمولاً مجموعه‌ای مشترک از APIها را در پلتفرم‌های مختلف ارائه می‌دهند. نمونه‌های معروف شامل Xamarin.com و Lua.org هستند. این رویکرد توسعه را بسیار آسان می‌کند. با این حال، شما برای ویژگی‌های جدید به ارائه‌دهنده پلتفرم وابسته هستید و چالش در اینجا زمانی است که آن ویژگی‌ها فقط در یک پلتفرم در دسترس هستند. گاهی اوقات مفاهیم پلیر از رویکرد "کمترین مخرج مشترک" (least common denominator) برای ویژگی‌های ارائه شده استفاده می‌کنند تا مشترکات بین پیاده‌سازی‌ها برای پلتفرم‌های مختلف حفظ شود.

کامپایل چند زبانه (Cross-Language Compilation)

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

سه رویکرد رایج برای کامپایل چند زبانه وجود دارد: ترجمه مستقیم منبع به منبع (direct source to source translation)، غیرمستقیم با ترجمه کد منبع به یک زبان انتزاعی میانی (intermediate abstract language) و کامپایل مستقیم به فرمت باینری (binary format) پلتفرم. رویکرد غیرمستقیم معمولاً کد کمتر خوانایی تولید می‌کند. این یک مشکل بالقوه است زمانی که می‌خواهید توسعه را در پلتفرم هدف ادامه دهید و از کد منبع ترجمه شده به عنوان نقطه شروع استفاده کنید.

برنامه‌های وب (هیبریدی) ((Hybrid) Web Apps)

توسعه وب هیبریدی (Hybrid web development) به معنای تعبیه یک نمای وب (web view) در یک برنامه بومی است. استاندارد برای برنامه‌های هیبریدی، ابزار منبع باز آپاچی کوردوا (Apache Cordova) (که قبلاً با نام فون‌گپ (PhoneGap) شناخته می‌شد) است. این رویکرد به شما امکان می‌دهد از درون بخش‌های وب برنامه خود به عملکردهای بومی دسترسی داشته باشید و همچنین می‌توانید از کد بومی برای جنبه‌های حیاتی عملکرد یا تجربه کاربری برنامه خود استفاده کنید. برنامه‌های هیبریدی به شما امکان می‌دهند بخش‌های توسعه وب را در پلتفرم‌های انتخابی خود مجدداً استفاده کنید. برای کسب اطلاعات بیشتر در مورد توسعه وب موبایل، فصل وب را بخوانید.

کد ANSI C

در حالی که HTML و برنامه‌نویسی وب از یک انتزاع بسیار بالا شروع می‌شوند، می‌توانید مسیر مخالف را با استفاده از ANSI C انتخاب کنید. می‌توانید کد ANSI C را در تمام پلتفرم‌های مهم مانند اندروید، آی‌او‌اس و ویندوز (Windows) اجرا کنید. مشکل اصلی این رویکرد این است که نمی‌توانید از درون ANSI C به APIهای خاص پلتفرم یا حتی کنترل‌های رابط کاربری دسترسی داشته باشید. استفاده از C بیشتر برای الگوریتم‌های پیچیده مانند رمزگذارهای صوتی (audio encoders) مرتبط است. سپس کتابخانه‌های مربوطه می‌توانند در هر پروژه برنامه برای یک پلتفرم استفاده شوند.

چارچوب‌های محبوب

در اینجا برخی از چارچوب‌های محبوبی که برای توسعه برنامه‌های چند پلتفرمی استفاده می‌شوند، بدون ترتیب خاصی آورده شده‌اند.

زامارین (Xamarin)

زامارین از هر دو سیستم موبایل و دسکتاپ پشتیبانی می‌کند و به ویژه به دلیل پشتیبانی از C# و XAML UI برای توسعه‌دهندگان ویندوز جذاب است. به طور سنتی، رابط کاربری با استفاده از مؤلفه‌های بومی ایجاد می‌شد، اما اکنون مؤلفه‌های رابط کاربری عمومی چند پلتفرمی نیز پشتیبانی می‌شوند. کتابخانه‌های بومی را می‌توان به راحتی ادغام کرد.

کوردوا (Cordova)

کوردوا که قبلاً با نام فون‌گپ شناخته می‌شد، یک رویکرد HTML/JS ارائه می‌دهد که ایجاد برنامه‌های موبایل را برای توسعه‌دهندگان وب بسیار آسان می‌کند. رابط کاربری توسط عناصر مرورگر رندر می‌شود، بنابراین شما یک تجربه وب کامل خواهید داشت. کد بومی را می‌توان با استفاده از رویکرد پلاگین ادغام کرد.

فلاتر (Flutter)

فلاتر یک چارچوب نسبتاً جدید است که رابط کاربری خود را کاملاً مستقل از رابط کاربری بومی سیستم‌عامل رندر می‌کند. علاوه بر پلتفرم‌های موبایل، از دسکتاپ‌ها و وب نیز پشتیبانی می‌کند. کد بومی را می‌توان با استفاده از مفهوم کانال (channel concept) فلاتر ادغام کرد.

ری‌اکت نیتیو (React Native)

با ری‌اکت نیتیو شما در JS کدنویسی می‌کنید در حالی که رابط کاربری از عناصر بومی تشکیل شده است و از یک تجربه بومی کامل اطمینان حاصل می‌کند. کد بومی را می‌توان با استفاده از پلاگین‌ها ادغام کرد.

یافتن چارچوب چند پلتفرمی مناسب

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

  • زنجیره ابزار چند پلتفرمی (cross-platform toolchain) شما چگونه کار می‌کند؟ از چه زبان برنامه‌نویسی و چه API می‌توانم استفاده کنم؟
  • آیا می‌توانم به عملکردهای خاص پلتفرم دسترسی داشته باشم؟ اگر بله، چگونه؟
  • آیا می‌توانم از مؤلفه‌های رابط کاربری بومی استفاده کنم؟ اگر بله، چگونه؟
  • آیا می‌توانم از یک ساخت خاص پلتفرم (platform-specific build) به عنوان پایه‌ای برای توسعه مداوم خود استفاده کنم؟ کد منبع ترجمه شده/تولید شده چگونه به نظر می‌رسد؟
  • آیا ادغام با دسکتاپ در دسترس است؟
  • آیا می‌توانم چند وظیفگی را کنترل کنم؟ آیا سرویس‌های پس‌زمینه وجود دارد؟
  • این راه‌حل با سرویس‌های پوش چگونه کار می‌کند؟
  • چگونه می‌توانم از خرید درون‌برنامه‌ای و تبلیغات درون‌برنامه‌ای استفاده کنم؟
  • این چارچوب چگونه با نسخه‌های جدید سیستم‌عامل همگام می‌شود؟
  • عملکرد این راه‌حل چگونه است؟

آخرین اما نه کم‌اهمیت‌ترین، برای بازی‌سازی، استفاده از یک راه‌حل چند پلتفرمی امری بدیهی است، زیرا ایجاد بازی محتوامحور است و بازی‌ها نیازی به ادغام عمیق در هر پلتفرم ندارند.

فصل ششم را از این جا بخوانید.