نکاتی در مورد اشتراک کد بین اندروید و iOS — به زبان ساده
یکی از نکاتی که موجب کندی زیادی در فرایند توسعه اپلیکیشن میشود، این واقعیت است که باید کدهای مختلفی برای پلتفرمهای گوناگون بنویسید. در صورتی که بتوان مقداری از کد اپلیکیشن را بین این پلتفرمها به اشتراک گذاشت، توسعه اپلیکیشن کاری بسیار کمهزینهتر خواهد شد. در این مقاله نکاتی در مورد اشتراک کد بین اندروید و iOS مورد اشاره قرار میگیرند.
دستیابی به اشتراک کد بین پلتفرمهای مختلف و همزمان حفظ کیفیت آن امری دشوار است، با این حال برخی روشها به این منظور وجود دارند. در ادامه این مقاله برخی راهحلهای عمده را در این زمینه معرفی میکنیم. ما قصد نداریم راهحل برتر را انتخاب کنیم، چون همه چیز به الزامات پروژه شما بستگی دارد. در واقع مانند همه موضوعهای دیگر در حوزه مهندسی نرمافزار، انتخاب یک راهحل به موارد زیادی بستگی دارد.
منطق کراس پلتفرم
ابتدا این نکته را بررسی میکنیم که چطور میتوان کد اپلیکیشن را بدون درگیر ساختن UI بین پلتفرمهای مختلف به اشتراک گذاشت. به این منظور باید به طور عمده از منطق اپلیکیشن بهره بگیریم که تا حدود زیادی بین پلتفرمهای مختلف یکسان است و از این رو قابلیت استفاده مجدد زیادی دارد.
استفاده از کد کامپایل شده
یک روش سرراست برای اشتراک کد، استفاده از زبانی است که به کد ماشین روی هر دو پلتفرم کامپایل میشود. به این منظور به طور تاریخی، غالباً از زبان C++ استفاده میشود، اما زبانهایی مانند Golang و Rust نیز عملکرد خوبی برای این تکنیک از خود نشان دادهاند. به طور عمده بازیها از این روش برای هدفگیری پلتفرمهای مختلف استفاده میکنند.
در این حیطه یک بازیگر جدید به نام «کاتلین» (Kotlin) نیز پا به عرصه گذاشته است. پروژه Kotlin/Native از LLVM برای کامپایل کاتلین به کد نیتیو استفاده میکند. این کد میتواند در اپلیکیشن iOS چه با زبان Swift و چه ObjectiveC مورد استفاده قرار گیرد.
Transcompilation
منظور از Transcompiler یک کامپایلر است که یک سورس کد را به سورس کد دیگر کامپایل میکند. در واقع Transcompiler کد را از یک زبان به زبانی دیگر مینویسد. با استفاده از این تکنیک، میتوانیم کد را با تبدیل از یک زبان مانند Java یا Kotlin به زبان دیگری مانند Objective C یا Swift بین پلتفرمهای مختلف به اشتراک بگذاریم.
با این حال نوشتن یک Transpiler کار دشواری است. گوگل با استفاده از پروژه J2Objc (+) این کار را عملی ساخته است و این ابزار امکان transpile کردن کد جاوا را به Objective C فراهم میسازد. گوگل در عمل این پروژه را در چند اپلیکیشن مورد استفاده قرار داده است.
با این حال کامپایل کردن کد cross-compiled برای اجری موفق روی پلتفرم iOS کار دشواری محسوب میشود.
Runtime-های باندل شده زبان
یک روش دیگر برای اشتراک کد این است که یک Runtime زبان را درون اپلیکیشن باندل کنیم. این وضعیت به طور عمده در مورد زبانهای مبتنی بر ماشین مجازی یا تفسیر شونده ضروری است.
برای نمونه با استفاده از این روش میتوانید در صورت داشتن یک مفسر جاوا اسکریپت درون اپلیکیشن، کد جاوا اسکریپت را به اشتراک بگذارید. رویکردهای دیگر که در این دسته جای میگیرند، شامل موارد زیر هستند:
- موتور زمان اجرای Dart
- یک Runtime برای Lisp (با هر زبان دیگر)
جابجایی کد به سمت سرور
شاید این کار عملاً یک راهحل محسوب نشود، چون شما عملاً کد را از سمت اپلیکیشن به سمت سرور جابجا میکنید. با این حال، یک تکنیک معتبر است که گاهی اوقات نادیده گرفته میشود. در این روش منطق تجاری در بکاند قرار میگیرد. به این ترتیب میتوانیم اپلیکیشنها را سبک حفظ کنیم. این کار عموماً در مورد اپلیکیشنهای ساده امکانپذیر است.
الگوی معماری «بکاند برای فرانتاند» (Backends-for-Frontend) در این دسته جای میگیرد.
UI کراس پلتفرم
در این بخش فریمورکهایی را معرفی میکنیم که امکان نوشتن اپلیکیشن در یک زبان و اجرای آن روی هر دو پلتفرم اندروید و iOS را فراهم میسازند.
وباپلیکیشنها
اگر فکر میکنید که لازم نیست اپلیکیشنی که طراحی میکنید، یک تجربه غنی به کاربران عرضه کند، در این صورت یک وبسایت که از API-های وب پیشرفته W3C/WHATWG استفاده میکند نیز میتواند کافی باشد. در واقع این گزینهای است که شاید در آینده جایگزین اپلیکیشنها شود. با این حال، در حال حاضر این اپلیکیشنها نواقصی دارند. بررسی این نواقص خارج از حیطه این مقاله است.
اپلیکیشنهای هیبرید (وب)
اپلیکیشنهای هیبرید به اپهایی گفته میشود که هم کد نیتیو را اجرا میکنند و هم یک runtime باندلشده برای اجرای زبان تفسیری متفاوتی دارند. این زبان غالباً جاوا اسکریپت است. ایده کار این است که یک وبسایت یا یک وبسایت باندلشده را در یک کامپوننت وب جاسازیشده در داخل پوشش اپلیکیشن نیتیو بارگذاری کنیم. این اپلیکیشن پوششی میتواند API-های نیتیو را که در میان API-های استاندارد وب قرار ندارند، در اختیار اپلیکیشن جاوا اسکریپت قرار دهد.
توجه کنید که عملکرد اپلیکیشنهای هیبرید ممکن است تفاوت فاحشی با اپلیکیشنهای نیتیو داشته باشد.
فریمورکهای تجرید UI نیتیو
برخی فریمورکها وجود دارند که یک لایه تجرید بر مبنای API-های نیتیو و کامپوننتهای UI ارائه میکنند. به این ترتیب میتوانید از کامپوننتهای نیتیو به یک روش انتزاعی استفاده کنید و اجازه دهید که فریمورک آنها را روی هر دو پلتفرم رندر کند.
ریاکت نیتیو
با استفاده از «ریاکت نیتیو» (React Native) میتوانیم کامپوننتهای UI را با استفاده از کامپوننتهای ریاکت نیتیو تعریف کنیم. این کامپوننتهای ریاکت نیتیو تجریدهایی از کامپوننتهای پلتفرم نیتیو هستند.
نکته جالب در مورد ریاکت نیتیو این است که یک فریمورک کاملاً واکنشی محسوب میشود که در آن بخش UI به صورت اعلانی کار میکند.
زامارین
«زامارین» (Xamarin) یک فریمورک مبتنی بر #C.NET است که یک لایه تجرید از پلتفرم نیتیو ارائه میکند.
فریمورکهای سفارشی UI
رویکرد دیگر این است که یک pipeline رندرینگ سفارشی UI در فریمورک کراس پلتفرم قرار دهیم. این بدان معنی است که دیگر نمیتوان از کامپوننتهای UI نیتیو به صورت مستقیم استفاده کرد. با این حال فلاتر یک راهحل برای این مشکل یافته است.
فلاتر
فلاتر یک فریمورک UI است که با استفاده از زبان Dart ساخته شده است. این فریمورک همه کامپوننتهای UI را روی iOS و اندروید به صورت دقیق شبیهسازی میکند. رندر کردن این کامپوننتهای UI به طور کامل در Dart انجام میشود.
به این ترتیب میتوانیم اپلیکیشنی بنویسیم که کاملاً نیتیو به نظر بیاید، اما در پسزمینه همه کدها در زبان Dart و با استفاده از کامپوننتهای UI فلاتر نوشته شده است. فلاتر پروژهای است که از سوی گوگل ساخته شده است و هماینک در دستگاههای Google Home و در دیگر اپلیکیشنهای گوگل مورد استفاده قرار میگیرد.
نکته جالب در مورد فلاتر این است که بخش زیادی از فکر و تلاشی که برای ساخت اپلیکیشن مورد نیاز است، از قبل از سوی گوگل در این فریمورک تدارک دیده شده است و بنابراین به یکی از بهترین روشهای حل مشکل توسعه اپلیکیشنهای کراس پلتفرم تبدیل شده است. توسعه اپلیکیشنها در فلاتر کاری سریع است و عملکرد اپلیکیشنها بالا است. از سوی دیگر اپلیکیشنها دارای ماهیتی واکنشی (Reactive) هستند.
سخن پایانی
روشهای زیادی برای اشتراک کد بین اندروید و iOS وجود دارند. بنابراین انتخاب گزینه صحیح از بین این همه گزینههای مختلف کاری دشوار است. در این مقاله برخی نکات در این خصوص مطرح شدند تا به تصمیمگیری صحیح شما کمک شود. توجه کنید که همیشه هم اشتراک کد بین دو پلتفرم به صلاح نیست و در واقع گاهی بهترین گزینه همان عدم اشتراک کد بین دو پلتفرم اندروید و iOS است.