معرفی Xamarin و مزیت‌های استفاده از آن
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: هفت دقیقه

چرا برنامه نویسی موبایل؟

با افزایش روزافزون SmartPhone ها و تبلت‌ها، بازار تکنولوژی به این سمت سوق پیدا کرده‌است. از این رو شرکت‌های ارائه دهنده نرم افزاری، از این موقعیت استفاده کرده و هر کدام پلتفرم متفاوتی را برای برنامه نویسی بر روی این اسمارت فون‌ها ارائه داده‌اند. یکی از بزرگترین دغدغه‌های امروزه شرکت‌های برنامه نویسی و توسعه نرم افزار موبایل، انتخاب درست پلتفرم برای توسعه نرم افزار میباشد. در این مقاله قصد دارم یکی از این پلت فرم‌ها را بررسی کرده و معرفی کنم.

شرکت xamarin کار خود را در سال 2011 با ارایه نسخه Cross Platform پلتفرم .Net به نام Mono آغاز کرد. بعد از ارایه این نسخه از .Net، زامارین به کمک Mono توانست پیاده سازی بر روی  Android و IOS را به نام‌های MonoForAndroid  و MonoTouch ارایه دهد. بعد از این نسخه‌ها برنامه نویسان توانستند بر روی سیستم عامل‌های اندروید و آی او اس به صورت Native کد خود را به زبان C# نوشته و آن‌ها را اجرا کنند.


چرا باید از Xamarin استفاده کنم؟

در ادامه مقاله قصد دارم شما را با برخی از ویژگی‌های زامارین آشنا کرده و مزایای استفاده از آن را بیان کنم. 

Xamarin امکانی را فراهم کرده‌است که برنامه نویسان به دو روش متفاوت قادر خواهند بود برنامه‌های خود را بنویسند:


Xamarin Native :1

زامارین به شما این امکان را میدهد که بتوانید به صورت مستقیم برای هر پلتفرم به صورت جداگانه برنامه نویسی کنید. در اندروید اینکار با Xamarin.Droid و در IOS اینکار با Xamarin.Touch امکانپذیر است. مزیت‌های استفاده از این روش عبارتند از:

·   بهره گیری از یک زبان برنامه نویسی

همانطور که میدانید یادگیری یک زبان برنامه نویسی هزینه‌ی زیادی را برای یک سازمان و یا یک شخص به همراه دارد. در زامارین این امکان فراهم شده‌است که با استفاده از تنها یک زبان برنامه نویسی مانند C# ، برنامه نویسان بتوانند برای پلتفرم‌های مختلف برنامه بنویسند. در نظر داشته باشید که UI در هر پلتفرم به صورت جداگانه پیاده سازی میشود. به طور مثال در اندروید به وسیله‌ی Android Xml میتوانید ظاهر برنامه خود را پیاده سازی کنید و منطق‌های خود را با زبان C# برای تمامی پلت فرم‌ها به صورت یکسان بنویسید.

·   تجربه کاربری Native

زامارین به شما این امکان را خواهد داد که با استفاده از کنترل‌های Native هر پلتفرم به تجربه کاربری همان پلت فرم دسترسی پیدا کنید و اپلیکیشنی با ظاهر و UX همان پلتفرم بسازید.

·   استفاده  100% از امکانات هر پلتفرم

زامارین به دلیل Native بودن این امکان را به برنامه نویسان ارائه میدهد که با استفاده از یک زبان و با بکارگیری Cycle  Life مخصوص هر پلتفرم،  به 100% امکانات و API ‌های هر پلتفرم دسترسی پیدا کنند.

·   Performance

به دلیل اینکه برنامه‌های زامارین به صورت Native اجرا میشوند Performance بالایی دارند.

·   دسترسی به API ‌های موجود در .Net

شما قادر خواهید بود با دانش موجود مانند Entity Framework Code و.. به فریم ورک .Net  دسترسی پیدا کرده و از API ‌های درون آن استفاده کنید. زامارین از یکی از پیاده سازی‌های .Net Standard استفاده میکند.

·   استفاده مجدد از کد

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

·   تست خودکار

در زامارین شما میتوانید برای کدهای خود تست خودکار نوشته و آنها را به صورت خودکار تست کنید.

·   Bind کردن Library ‌های Objective-C و Java

زامارین طوری طراحی شده‌است که دست شما را در هیچگونه شرایطی نخواهد بست. شما میتوانید به صورت مستقیم کدهایی را که به زبان های Java  و Objective-C نوشته شده‌اند، به پروژه اضافه کرده و هیچگونه نگرانی از بابت کدهای از قبل نوشته شده که به زبان‌های Objective-C و Java هستند، نداشته باشید.

·   Designer

در زمارین این امکان وجود دارد که در هر پلتفرم از طریق Designer مخصوص به آن پلتفرم، UI خود را طراحی و پیاده سازی کنید.

·   Async

  در برنامه نویسی غیر همزمان ( Asynchronous Programming ) این امکان وجود دارد که برنامه شما بدون توقف، یک قسمت از کد را اجرا کرده و منتظر اجرای قسمت‌های دیگر کد نشود؛ یا به اصطلاح برنامه از حالت Response خارج نشود. در زبان‌های Java ، Objective-C و Swift اینکار باید با CallBack و به صورت Manual مدیریت شود؛ اما #C این امکان را فراهم آورده است که به راحتی اینکار را انجام داده و برنامه خود را همیشه در حالت پاسخ دهی نگه دارید.  

public async Task<List<FeedItem>> GetFeedItems(DateTime date) {
  var feed = "http://planet.xamarin.com/feed/";
  var response = await httpClient.GetStringAsync(feed);
  var items = await ParseFeedAsync(response);
  return items.Where(item => item.Published.Date == date).ToList();
}


·   Parallel Programming

در برنامه نویسی موازی( Parallel Programming )  برخلاف برنامه نویسی MultiThread که بر روی یک هسته CPU اجرا میشود، بر روی چندین هسته CPU به صورت موازی اجرا میشود. زامارین از این نوع برنامه نویسی پشتیبانی میکند.


Xamarin.Forms: 2

پس از معرفی Xamarin Forms API شما میتوانید علاوه بر مزیت‌هایی که در بالا اشاره شد، کدهای Logic خود را با زبان C# و کدهای UI خود را با زبان XAML پیاده سازی کرده و با یک بار نوشتن کد، در پلتفرم‌های مختلف خروجی خود را مشاهده کنید.  مزیت استفاده از Xamarin Forms عبارتند از:

·   استفاده از کد واحد برای پیاده سازی UI و Logic

یکی از بهترین مزیت‌هایی را که میتوان به آن اشاره نمود این است که شما کافیست یک بار کد خود را بنویسید و Xamarin Forms کد شما را در پلت فرم‌های متفاوت پیاده سازی خواهد کرد.

<?xml version="1.0" encoding="UTF-8"?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            x:Class="MyApp.MainPage">
    <TabbedPage.Children>
        <ContentPage Title="Profile" Icon="Profile.png">
            <StackLayout Spacing="20" Padding="20"
                         VerticalOptions="Center">
                <Entry Placeholder="Username"
                       Text="{Binding Username}"/>
                <Entry Placeholder="Password"
                       Text="{Binding Password}"
                       IsPassword="true"/>
                <Button Text="Login" TextColor="White"
                        BackgroundColor="#77D065"
                        Command="{Binding LoginCommand}"/>
            </StackLayout>
        </ContentPage>
        <ContentPage Title="Settings" Icon="Settings.png">
            <!-- Settings -->
        </ContentPage>
    </TabbedPage.Children>
</TabbedPage>


برای پیاده سازی UI در Xamarin Forms باید از XAML استفاده کنید. همچنین مانند روش قبلی میتوانید از زبان C# برای پیاده سازی منطق، استفاده نمایید.

با استفاده از Xamarin Forms شما تجربه نوشتن کد Cross Platform را در کنار Native بودن آن خواهید داشت.

·   استفاده از یک کنترل مخصوص یک پلتفرم در بین کد ( Embedding )

در Xamarin Forms این امکان وجود دارد که اگر شما خواستید یک کنترل مخصوص IOS را در بین کدهای خود استفاده کنید، بتوانید به راحتی اینکار را انجام دهید.( (Embedding

اگر به تصویر بالا دقت کنید متوجه خواهید شد که در یکسری از کنترل‌ها، تصاویر متفاوت هستند. در نسخه اندروید یک Action Button در قسمت پایین صفحه مشاهده میکنید که در نسخه‌ی IOS آن موجود نیست. یعنی به صورت مستقیم کنترل Action Button که مختص به پلت فرم اندروید میباشد، درون Xamarin Forms استفاده شده است.

·   دسترسی به هر پلتفرم به طور مستقیم

شما قادر خواهید بود به طور مستقیم به هر پلت فرم دسترسی پیدا کرده و به طور مثال در هر پلتفرم، UI مخصوص به خود را با Property ‌های مخصوص به خود طراحی کنید.

·   UITest و Test Cloud

در Xamarin Forms  میتوانید برای UI خود تست نوشته و آن‌ها را به وسیله Xamarin Test Cloud بر روی صدها Device متفاوت تست کنید. (این امکان فقط برای Android و IOS وجود دارد.)

·   Life Cycle مشابه در تمامی پلتفرم ها

همانطور که میدانید پلتفرم‌های مختلف، Life Cycle ‌های متفاوتی برای مدیریت اپلیکیشن دارند. یکی از مزیت‌های استفاده از Xamarin Forms این است که شما میتوانید برای تمامی پلتفرم‌ها به‌وسیله‌ی یک Life Cycle یکسان کد بنویسید.

·   Previewer

یکی از بهترین قابلیت‌هایی که در Xamarin Forms اضافه شده‌است این است که شما قادر خواهید بود به صورت Real Time خروجی فایل XAML خود را به وسیله Previewer مشاهده نمایید.

·   Performance Profiler

به وسیله Xamarin Profiler شما میتوانید میزان مصرف حافظه، Performance و ... را در اندروید و IOS اندازه گیری نمایید.

نکات قابل توجه:

Ø   استفاده همزمان از Xamarin Forms و Xamarin Native

شما میتوانید کدهای خود را با حداکثر Reusability نوشته و در صورت لزوم با کدهای Xamarin Native ترکیب کنید.

Ø   Documentation خیلی خوب

زمارین  مستندات جامع و کاملی را در سایت خود گردآوری کرده که میتوانید به راحتی از آن برای فهم تمامی قسمت‌های Xamarin استفاده کنید.

  • #
    ‫۷ سال و ۹ ماه قبل، چهارشنبه ۲۴ آذر ۱۳۹۵، ساعت ۱۶:۵۸
    سلام ممنون بابت مطلب مفیدتون
    من تازه شروع کردم و فعلا در حال کار با اندروید هستم. برای اینکه بتوان یک برنامه رو در قالب هر سه پلتفرم پیاده سازی کرد باید از Xamarin Form استفاده شود؟ این بخش در کدام قسمت VS هست؟ و یا اینکه باید Xamarin رو جداگانه نصب کرد؟
      • #
        ‫۷ سال و ۹ ماه قبل، چهارشنبه ۲۴ آذر ۱۳۹۵، ساعت ۱۷:۰۸
        ممنون عالی بود.
        تشکر
    • #
      ‫۷ سال و ۹ ماه قبل، چهارشنبه ۲۴ آذر ۱۳۹۵، ساعت ۱۷:۰۵
      با سلام خدمت شما دوست عزیز
      بله برای پیاده سازی بر روی هر سه پلتفرم میتوانید از Xamarin Forms استفاده کنید. در هنگام نصب Visual Studio 2015 شما میتوانید Xamarin رو انتخاب کرده تا بر روی سیستم شما نصب گردد. در نظر داشته باشید که برای نصب Xamarin باید از فیلترشکن استفاده نمایید. در مقاله‌های بعدی نصب Xamarin و نحوه استفاده از آن را به طور کامل بیان خواهم کرد. اما در حال شما شما میتوانید این کار را با استفاده از مقاله‌های سایت Xamarin دنبال کنید.
      در نظر داشته باشید که اگر شما از Xamarin.Android استفاده میکنید، میتوانید از قسمت Croos PlatForm در VS اقدام به ساخت پروژه Xamarin Forms بکنید.
  • #
    ‫۷ سال و ۹ ماه قبل، چهارشنبه ۲۴ آذر ۱۳۹۵، ساعت ۱۷:۳۴
    ممنون میشم در مورد اندازه و حجم نهایی برنامه‌ها و همچنین کتابخانه‌های بومی که برای مثال برای اندروید موجود هستند و ممکن هست  نمونه مشابه کراس نداشته باشند هم توضیح دهید.
    • #
      ‫۷ سال و ۹ ماه قبل، چهارشنبه ۲۴ آذر ۱۳۹۵، ساعت ۱۷:۵۴
      با عرض سلام خدمت شما
      در مورد استفاده از کتابخانه‌های بومی در مقاله گفته شد که به راحتی شما قادر خواهید بود که کتابخانه‌های Java و Objective-C را به برنامه خود Bind کنید.در مورد حجم اپلیکیشن هم در مقالات بعدی مفصل بحث خواهد شد.
      در حال حاضر با افزایش حجم حافظه موبایل‌ها حجم اپلیکیشن خیلی مد نظر نخواهد بود و بیشترین چیزی که میتواند باعث متمایز بودن یک فریم ورک شود، Performance و راحتی کار با فریم ورک در حین دسترسی کامل به آن میباشد.
      حداقل حجم نرم افزارهای Android و IOS حدود 3 مگ میباشد و بیش از 2.5 مگ آن مربوط به .Net میباشد به همین خاطر اینطور قلمداد نکنید که با پیچیده‌تر شدن اپلیکیشن حجم برنامه به صورت تصاعدی بالا خواهد رفت. در صورتی که چنین نخواهد بود 
  • #
    ‫۷ سال و ۹ ماه قبل، پنجشنبه ۲۵ آذر ۱۳۹۵، ساعت ۱۸:۴۳
    بنظر من در صورتی که بحث Cross Platform بودن مد نظر نباشه, برای برنامه‌های اندرویدی, زامارین مزیت خاصی نسبت به اندروید استودیو نداره و اصلا امکانات اندروید استودیو با توجه به IDE بسیار قدرتمند شرکت JetBrains فوق العاده کاربردی هست. برای نمونه ابزار Lint کمک شایانی به آنالیز کد میکنه...
    حتی برای کسانی که Java کار نکرده اند و #C کار کرده اند(مثل بنده) براحتی قابل استفاده است. چرا که پایه و اساس جاوا و سی شارپ بسیار شبیه بهم میباشد. سی شارپ را بیشتر می‌پسندم ولی در مجموع اندروید استودیو را ترجیح میدهم. 
    در مورد حجم apk نیز باید بگویم این offset سه الی چهار مگابایتی برای برنامه‌های کوچک بسیار زیاد است و کاملا نامناسب برای مارکتهای داخلی. چرا که کاربران حجم بالا را نمی‌پسندند. مگر اینکه نرم افزار گیم با گرافیک بالا باشد تا این چند مگابایت قابل اغماض باشد.
    با توجه به اینکه تیم گوگل برای اندروید استودیو بروزرسانی‌های تقریبا هفتگی ارائه میدهند بعید میدانم در زمینه پلتفرم برنامه نویسی اندروید, زامارین بتواند cutting edge باشد. 
    در مجموع بنظر بنده برای هر پلتفرم بهتر است از ابزار بومی خود آن استفاده گردد. اندروید استودیو و جاوا برای اندروید, اِکس کد و سوئیفت برای iOS و ویژوال استودیو و سی شارپ برای ویندوز.
    • #
      ‫۷ سال و ۹ ماه قبل، پنجشنبه ۲۵ آذر ۱۳۹۵، ساعت ۲۰:۴۸
      با سلام خدمت شما دوست عزیز
      بابت نظرتون واقعا تشکر میکنم که این مطلب براتون حائز اهمیت بوده که دربارش نظر دادید.
      یک مطلبی که عرض کردید رو با کمال احترام رد میکنم. شما گفتید که 3-4 مگ رو کاربر‌ها قبول ندارند برای برنامه‌های کوچک. بیایید راجع به واقعیت صحبت کنیم. در حال حاضر اگر شما به مارکت‌های داخلی و حتی خارجی نگاه کنید خیلی خیلی کم پیش میاد که بتونید نرم افزاری زیر 3-4 مگ رو پیدا کنید. و در واقعیت میشه گفت تعداد دانلود تمام نرم افزارها بسیار بالاست. پس میتوان نتیجه گرفت که کاربران به دانلود برنامه‌های بیش از 3-4 مگ عادت کرده اند و در حال حاضر اون رو یک عیب قلمداد نمیکنن. 
      در رابطه با استفاده از ابزارهای بومی میخواستم چیزی رو خدمتتون عرض کنم. شما فرض رو بر این بگیرید که سازمانی رو در اختیار دارید که بودجه 5-6 میلیونی برای برنامه نویسی در اختیار دارید. این فرض خیلی از شرکت‌ها رو در بر میگیره که میخوان اپلیکیشنی رو طراحی کنن اما مقدار بودجه زیادی رو ندارن. حالا یک سوال از شما میپرسم. آیا حاضرید برای هر کدوم از پلتفرم‌های مختلف کارشناس بگیرید؟ کارشناسی که بتونه یک پلتفرم رو به تنهایی توسعه بده و ببره جلو چقد باید مهارت داشته باشه؟ و آیا هزینه شما در این حالت بیشتر نخواهد شد؟ پس میشه یه نتیجه گیری کرد که Cross-Platform بودن در حال حاضر علاوه بر مدیریت بهتر توسعه راحت‌تر و.... فوق العاده هزینه شما رو پایین میاره.
      استفاده از زبان‌های مختلف برنامه نویسی اون هم در حد EnterPrise هزینه زیادی رو برای یه سازمان دربرداره.
      • #
        ‫۷ سال و ۹ ماه قبل، پنجشنبه ۲۵ آذر ۱۳۹۵، ساعت ۲۲:۱۹
        این که عرض کردم حجم 3 الی 4 مگابایتی از نظر کاربران زیاد قابل قبول نیست به دلیل آماری است که از دوستان و آشنایانی که نرم افزار را برایشان جهت تست ارسال می‌نمودم بدستم رسیده است(در نسخه‌های بعدی با اندروید استودیو حجم کاهش زیادی پیدا نمود و یک سری باگ عجیب و غریب که منشا آنها را هنوز هم نمیدانم رفع شدند). که صد البته جامعه آماری بزرگی نیست و نتیجه آنرا براحتی نمی‌توان به کل جامعه تعمیم داد. بنده چندین app در مارکتهای داخلی منتشر نمودم که همگی زیر 2.3 مگابایت حجم دارند و اتفاقا بیشتر هم Game هستند و با گرافیک خوب. برای مثال اگر سودوکو 2 را در بازار(امیدوارم تصور نشود که قصد تبلیغ دارم) مشاهده نمایید میبینید که نرم افزار با این کیفیت و با این حجم نمی‌تواند خروجی Xamarin باشد. اگر تصور شود که از روی تعصب صحبتی میکنم باید بگویم که اتفاقا اگر تعصبی هم وجود داشته باشد نسبت به سی شارپ است نه جاوا. 
        در مورد بحث CrossPlatform و کاهش هزینه‌ها برای شرکتهای کوچک و با بودجه محدود به طور حتم Xamarin برنده است. اما شرکتهای بزرگ اغلب رغبتی به استفاده از Xamarin ندارند. برای مثال تلگرام...
        البته استفاده بنده از Xamarin قبل از خریداری آن توسط مایکروسافت هست و امیدوارم با کار مایکروسافت روی این تکنولوژی دیگر خبری از باگهای عجیب و غریبی که بنده را فراری دادند نباشد و بتوانم با زبان بسیار عالی و دوست داشتنی سی شارپ هم app موبایل تولید نمایم.(برای نرم افزارهای موبایل سازمانی انتخاب مناسبی هست)
    • #
      ‫۷ سال و ۹ ماه قبل، پنجشنبه ۲۵ آذر ۱۳۹۵، ساعت ۲۱:۳۱
      امروزه کمی با  افزایش سرعت و درگیر شدن بیشتر کاربران با اینترنت حجم بالاتر تا حدی پذیرفته شده هست ولی باید نگاهی به تعداد رفرنس‌ها و .. هم نگاه کرد که تا چه حد افزایش حجم خواهد بود.
      برنامه‌های حجم بالاتر که عموما توسط کاربران پذیرفته میشن برنامه هایی هستن که عموما در سطح جامعه شناخته شده باشند چون تلگرام و ... ولی برای مابقی تعدادی از کاربرها ممکن است این مورد را نپذیرند و به راحتی از کنار آن بگذرند.

      در مورد این که زمانی طول میکشه این تبدیل کدهای sdk توسط تیم زمرین انجام بشه مطمئنا وجود داره ولی با یک نگاه به این مسئله که api‌های سطح جدید در واقعیت دنیای ما مدتی طول میکشه تا جا باز کنه و مطمئنا تا قبل از اون موقع تیم زمرین کار رو تموم کرده. نوشتن برنامه ای با سطح بالای api‌ها در همان لحظه برابر است با نداشتن کاربری که این نسخه از اندروید را روی گوشی اش داشته باشد و بعد از آن هم تعداد اندکی از کاربران خواهند بود که این نسخه را دارند پس با این حساب این مسئله تا مدت‌ها منتفی است.
  • #
    ‫۷ سال و ۹ ماه قبل، پنجشنبه ۲۵ آذر ۱۳۹۵، ساعت ۱۹:۰۹
    برای کاهش حجم خروجی apk راههایی پیشنهاد شده.
    Linking on Android 
    • #
      ‫۷ سال و ۹ ماه قبل، پنجشنبه ۲۵ آذر ۱۳۹۵، ساعت ۲۱:۵۰
      دوست عزیز این حجم 3 الی 4 مگابایتی بعد از اعمال Linking هست وگرنه حجم apk یک نرم افزار ساده تا 30 مگابایت هم میرسه!
      • #
        ‫۷ سال و ۹ ماه قبل، پنجشنبه ۲۵ آذر ۱۳۹۵، ساعت ۲۲:۱۳
        حدود یک نرم افزار ساده 14 مگ هستش. بعد هم چه مشکلی با Linking هست؟
        Linker اسمبلی هایی که توی اپلیکیشن استفاده نشده اند رو حذف میکنه پس اساسا مشکلی توی کار نرم افزار ایجاد نمیکنه
        • #
          ‫۷ سال و ۹ ماه قبل، پنجشنبه ۲۵ آذر ۱۳۹۵، ساعت ۲۲:۳۰
          بنابه مستندات Xamarin اعمال Linker می‌تواند سبب ایجاد مشکل شود:

          The  Don't Link  option turns off the linker; the above "Release without Linking" application size example used this behavior. This is useful for troubleshooting runtime failures, to see if the linker is responsible. This setting is not usually recommended for production builds
          روش Linker برای حذف اسمبلی‌های اضافی به صورت آماری می‌باشد و ممکن است اسمبلی ای به صورت اشتباه حذف گردد. 
          • #
            ‫۷ سال و ۹ ماه قبل، دوشنبه ۲۹ آذر ۱۳۹۵، ساعت ۱۹:۱۹
            با سلام خدمت شما
            linked سعی می‌کنه کدهای بلا استفاده رو از تو اسمبلی‌های رفرنس خورده حذف کنه، مشابه با pro guard در اندروید
            اگر کدی به صورت داینامیک فراخونی شده باشه به اشتباه حذف می‌شه، در اون صورت می‌شه نام یک اسمبلی یا یک کلاس یا یک متد رو داد که حذف نشه، که این واقعا کم پیش میآد 
            اینکار یعنی link باید حتما انجام بشه