021-88881776

آموزش انتشار (Deployment) و ساخت بسته نصبی در Flutter

اگر به دنبال یک آموزش Flutter از سطح مبتدی تا پیشرفته برای یادگیری نحوهٔ انتشار (Deployment) و ساخت بسته نصبی در Flutter هستید، این مقاله برای شماست. در این مطلب، گام‌به‌گام به بررسی چگونگی ساخت خروجی‌های لازم برای اپلیکیشن‌های اندروید، iOS، وب و دسکتاپ پرداخته و با مثال‌های عملی و توضیحات واضح، فرایند را برای شما آسان می‌کنیم. همچنین، نکات ضروری مربوط به امضای دیجیتال، تنظیمات فایل‌های مربوطه و مراحل آپلود در فروشگاه‌ها را قدم به قدم بررسی خواهیم کرد.

ساخت APK و AAB برای اندروید

در فرآیند انتشار (Deployment) و ساخت بسته نصبی در Flutter برای اندروید، ما می‌توانیم دو نوع خروجی اصلی داشته باشیم: APK و AAB. فایل APK یک بسته نصبی مستقیم است که روی دستگاه اندرویدی نصب می‌شود؛ در حالی که AAB (Android App Bundle) ساختاری جدیدتر است که گوگل پلی بر اساس معماری دستگاه کاربر، فقط قسمت‌های ضروری را دانلود می‌کند. در ادامه به جزئیات بیشتری در مورد این فرایندها پرداخته شده است:

۱.۱. ساخت APK

APK یا Android Package Kit، فرمت استاندارد برای نصب اپلیکیشن‌های اندرویدی است. وقتی شما از Flutter خروجی APK می‌گیرید، در واقع تمام نیازمندی‌های اپلیکیشن (کد، منابع گرافیکی و فایل‌های پشتیبانی) در یک فایل واحد بسته‌بندی می‌شود.

تفاوت حالت Debug و Release

Debug: در این حالت (که در حین توسعه به‌صورت پیش‌فرض استفاده می‌شود) برخی امکانات مانند Hot Reload فعال است، حجم فایل کمی بزرگ‌تر است و کد شما امضا (sign) نشده یا با امضای debug امضا می‌شود.
Release: در این حالت، کد نهایی شما برای انتشار (Deployment) و ساخت بسته نصبی در Flutter بهینه‌سازی می‌شود. ویژگی‌هایی مانند Hot Reload غیرفعال است و معمولاً اندازهٔ فایل خروجی کوچک‌تر و سرعت اجرا سریع‌تر است.

مراحل ساخت APK در حالت Release

باز کردن ترمینال یا خط فرمان

ابتدا به پوشهٔ اصلی پروژه Flutter خود رفته و دستور زیر را وارد کنید:

flutter build apk --release

این دستور یک فایل APK در مسیر build/app/outputs/flutter-apk/ تولید می‌کند.

اطمینان از پیکربندی درست محیط اندروید

شما باید Android SDK را نصب کرده و متغیرهای محیطی (ENV) لازم را به درستی تنظیم کرده باشید. همچنین شبیه‌ساز اندروید یا دستگاه واقعی متصل به سیستم، باید توسط adb شناسایی شود.

تنظیمات پیشرفته در فایل build.gradle

اگر نیاز دارید برای معماری‌های مختلف (مثلاً x86، ARM، ARM64) فایل جداگانه بسازید یا از قابلیت‌های پیشرفته مثل minify (کوچک‌سازی کد) یا shrinkResources (کوچک‌سازی منابع) استفاده کنید، می‌توانید در فایل android/app/build.gradle موارد زیر را فعال کنید:

android {
    compileSdkVersion 33
    defaultConfig {
        // ...
    }
    buildTypes {
        release {
            // فعال‌سازی کوچک‌سازی کدها
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    // ...
}

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

ساخت نسخه‌های تفکیک‌شده (Split APKs)

گاهی ممکن است بخواهید برای هر معماری پردازنده (arm, arm64, x86 و غیره) به صورت مجزا یک APK بسازید. برای این کار می‌توانید گزینهٔ –split-per-abi را استفاده کنید:

flutter build apk --release --split-per-abi

در این صورت، چند فایل APK متفاوت در خروجی خواهید داشت که هر کدام برای معماری خاصی مناسب است.

۱.۲. ساخت AAB (Android App Bundle)

AAB یا Android App Bundle روشی جدیدتر و بهینه‌تر برای انتشار اپلیکیشن در گوگل پلی است. مزیت اصلی AAB در این است که کاربر فقط ماژول‌های مورد نیاز برای دستگاهش را دانلود می‌کند و این امر باعث کاهش حجم دانلود و نصب می‌شود.

مراحل ساخت AAB در Flutter

ساخت AAB
تنها با اجرای دستور زیر، یک فایل AAB تولید می‌شود:

flutter build appbundle --release

این خروجی معمولاً در مسیر build/app/outputs/bundle/release/ قرار می‌گیرد.

کاهش حجم دانلود و نصب

وقتی شما AAB را در Google Play منتشر می‌کنید، گوگل پلی به‌صورت خودکار برای هر دستگاه، فایل APK مناسب را (از نظر معماری پردازنده، زبان و …) تولید و عرضه می‌کند.
در نتیجه، کاربر تنها بخش‌های مورد نیاز را دانلود می‌کند و به شکل محسوسی حجم دانلود و فضای اشغال‌شده روی گوشی‌اش کاهش می‌یابد.

تنظیمات سفارشی در فایل build.gradle

شما همچنان می‌توانید از تنظیمات پیشرفته (مانند minify، shrinkResources و …) استفاده کنید و آن‌ها را در فایل build.gradle فعال کنید تا AAB نهایی بهینه‌ترین حالت ممکن را داشته باشد.

مقایسه AAB و APK

حجم فایل: در هنگام آپلود در گوگل پلی، AAB اغلب در درازمدت باعث کاهش حجم دانلود کاربر می‌شود.
نحوه نصب مستقیم: فایل AAB را نمی‌توان به شکل مستقیم روی دستگاه نصب کرد. اگر نیاز دارید مستقیماً برای تست یا توزیع داخلی (Outside Play Store) نصب کنید، APK مناسب‌تر است.
روند انتشار در گوگل پلی: گوگل با دریافت AAB، برای هر دستگاه، APK جداگانه می‌سازد؛ ولی اگر APK را مستقیماً آپلود کنید، یک بستهٔ یکپارچه برای همه دستگاه‌ها ارائه می‌دهید.

چرا استفاده از AAB پیشنهاد می‌شود؟

در بحث انتشار (Deployment) و ساخت بسته نصبی در Flutter، اغلب توصیه می‌شود از AAB به عنوان خروجی اصلی برای گوگل پلی استفاده کنید، زیرا:

کاهش حجم: باعث مصرف کمتر داده و فضای دستگاه کاربر می‌شود.
مدیریت ساده‌تر در فروشگاه: گوگل پلی به صورت خودکار نسخهٔ بهینه را برای کاربران ارائه می‌دهد.
ارائه ویژگی‌های پویا (Dynamic Features): امکان استفاده از ماژول‌های پویا وجود دارد تا تنها در زمان نیاز، ویژگی‌ها دانلود شوند.
در حالت کلی، اگر می‌خواهید اپلیکیشن را مستقیماً (خارج از فروشگاه‌های رسمی) در اختیار کاربران قرار دهید یا قصد تست مستقیم روی دستگاه را دارید، APK بهترین گزینه است.
برای انتشار عمومی در گوگل پلی و بهره‌گیری از مزایای حجم کمتر و مدیریت ساده‌تر، AAB انتخاب ایده‌آلی است. به این ترتیب، با رعایت نکات فوق و شخصی‌سازی تنظیمات فایل‌های build.gradle، می‌توانید به بهترین شکل از امکانات انتشار (Deployment) و ساخت بسته نصبی در Flutter برای اندروید استفاده کنید.

امضای دیجیتال (Signing)

فرایند امضای دیجیتال یک مرحلهٔ حیاتی در انتشار (Deployment) و ساخت بسته نصبی در Flutter به‌شمار می‌رود. بدون امضای معتبر، مارکت‌های رسمی (مانند Google Play) اجازهٔ انتشار اپلیکیشن را نخواهند داد. در واقع، امضای دیجیتال تضمین می‌کند که فایل نصبی شما توسط شخص یا گروه دیگری دستکاری نشده است. در ادامه به جزئیات بیشتری دربارهٔ ایجاد و مدیریت فایل keystore و تنظیم آن در پروژه Flutter می‌پردازیم.

۲.۱. ایجاد فایل Keystore

Keystore یک فایل رمزنگاری است که حاوی اطلاعات کلید خصوصی شماست. این کلید خصوصی برای امضای نهایی اپلیکیشن استفاده می‌شود و باید آن را در محل امنی نگه دارید.

اجرای دستور keytool

برای ساخت keystore، وارد ترمینال یا خط فرمان شده و دستور زیر را اجرا کنید:

keytool -genkey -v -keystore my-release-key.keystore -alias my_alias -keyalg RSA -keysize 2048 -validity 10000

my-release-key.keystore: نام فایل keystore که می‌خواهید ایجاد شود.
my_alias: نام مستعاری (alias) که برای کلید خود انتخاب می‌کنید.
-validity 10000: مدت اعتبار (برحسب روز) برای کلید. مقدار 10000، حدود ۲۷ سال را پوشش می‌دهد.

وارد کردن اطلاعات شخصی و رمز عبور

هنگام اجرای این دستور، از شما اطلاعاتی مانند نام، نام خانوادگی، سازمان، شهر و کشور خواسته می‌شود. همچنین باید رمزی برای فایل keystore و برای خودِ کلید (key) تعیین کنید.

storePassword: رمز عبور مربوط به خود فایل keystore
keyPassword: رمز عبور مخصوص کلید (alias)

محل نگهداری فایل keystore

سعی کنید فایل my-release-key.keystore را در مکانی امن و حتی‌الامکان خارج از پوشهٔ اصلی پروژه Flutter قرار دهید تا در صورت اشتراک‌گذاری کد پروژه، اطلاعات امنیتی شما در دسترس عموم قرار نگیرد.

۲.۲. تنظیمات در پروژه Flutter

پس از ساخت keystore، باید پروژهٔ Flutter را طوری تنظیم کنید که در مرحله ساخت (Build)، به‌صورت خودکار از این keystore برای امضای اپلیکیشن استفاده شود. این مرحله برای انتشار (Deployment) و ساخت بسته نصبی در Flutter ضروری است.

مرحله ۱: ساخت فایل key.properties

در ریشه پروژه (یا پوشهٔ اصلی)، یک فایل متنی به نام key.properties بسازید.
اطلاعاتی را که در مرحلهٔ قبل تعیین کردید، به‌شکل زیر در این فایل وارد کنید:

storePassword=<رمز عبور keystore>
keyPassword=<رمز عبور کلید>
keyAlias=my_alias
storeFile=<مسیر کامل تا فایل keystore>

storeFile: مسیر فایل keystore. برای مثال، C:/keys/my-release-key.keystore یا /Users/username/keys/my-release-key.keystore.
نکته: توصیه می‌شود فایل key.properties را در .gitignore قرار دهید تا این اطلاعات در مخزن کد منبع (Git) بارگذاری نشود.

مرحله ۲: پیکربندی فایل android/app/build.gradle

فایل android/app/build.gradle را باز کنید.

در بالای این فایل، کد زیر را اضافه یا تکمیل کنید:

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

این قطعه کد وظیفهٔ خواندن اطلاعات keystore از فایل key.properties را بر عهده دارد.

در بخش android { … }، تنظیمات مربوط به امضای دیجیتال را اضافه کنید:

android {
    // سایر تنظیمات مانند compileSdkVersion و defaultConfig

    signingConfigs {
        release {
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
        }
    }

    buildTypes {
        release {
            // فعال کردن تنظیمات انتشار (Release)
            signingConfig signingConfigs.release
        }
    }
}

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

نکات امنیتی و مدیریتی

پشتیبان‌گیری از keystore:

اگر فایل keystore را گم کنید یا رمز عبور آن را فراموش نمایید، دیگر قادر به بروزرسانی اپلیکیشن خود با همان امضا نخواهید بود و مارکت‌ها نسخه جدید را به‌عنوان یک اپ کاملاً متفاوت شناسایی می‌کنند. پس از فایل keystore نسخهٔ پشتیبان تهیه کرده و در محلی امن (مانند فضای ابری رمزگذاری‌شده) نگهداری کنید.

نگهداری رمز عبور:

سعی کنید رمز عبور keystore و کلید را در مکان‌های امن (مانند ابزارهای مدیریت پسورد) نگهداری کنید و هرگز آنها را در مخازن عمومی قرار ندهید.

تفاوت امضای Debug و Release:

Debug: به‌صورت پیش‌فرض توسط کلید و گواهی دیباگ امضا می‌شود و برای تست و اجرای محلی استفاده می‌گردد.
Release: نیازمند کلید اختصاصی شماست و برای توزیع نهایی و رسمی اپلیکیشن در مارکت‌ها ضروری است.

امضای دیجیتال یا Signing، گامی حیاتی در روند انتشار (Deployment) و ساخت بسته نصبی در Flutter به‌شمار می‌رود. با تولید و استفاده از keystore اختصاصی، اپلیکیشن شما در مارکت‌های رسمی قابل اعتماد خواهد بود و کاربران می‌توانند با اطمینان آن را نصب کنند. همچنین، رعایت نکات امنیتی و نگهداری درست از کلید و رمز عبور، به جلوگیری از مشکلاتی مانند عدم توانایی به‌روزرسانی یا دستکاری فایل توسط افراد سودجو کمک شایانی می‌کند.

تنظیمات نهایی در فایل‌های build.gradle

در روند انتشار (Deployment) و ساخت بسته نصبی در Flutter برای اندروید، فایل‌های تنظیمات Gradle نقش مهمی در کنترل رفتار پروژه و تنظیم وابستگی‌ها (Dependencies) ایفا می‌کنند. از آن‌جا که پوشهٔ اندروید پروژهٔ Flutter ساختار شبیه به پروژه‌های اندروید معمولی دارد، اکثر این تنظیمات در مسیر android/app/build.gradle قرار می‌گیرد. در ادامه، مهم‌ترین بخش‌های این فایل و نکات مربوط به آن را بررسی می‌کنیم:

۱. مقادیر minSdkVersion و targetSdkVersion

این دو مقدار تعیین می‌کنند که اپلیکیشن شما روی چه نسخه‌هایی از اندروید قابل نصب باشد و با چه نسخه‌ای از اندروید سازگاری کامل داشته باشد:

minSdkVersion: حداقل نسخهٔ اندروید مورد نیاز برای اجرا. عدد ۲۱ (که مربوط به اندروید ۵) انتخاب متداولی برای بسیاری از اپلیکیشن‌هاست، اما اگر اپلیکیشن شما قابلیت‌هایی نیاز دارد که از نسخه‌های بالاتر اندروید پشتیبانی می‌شود، باید این مقدار را افزایش دهید.
targetSdkVersion: نسخه‌ای از اندروید که اپلیکیشن شما برای آن بهینه شده است. گوگل معمولاً در بازه‌های زمانی مشخص، آپدیت‌هایی اجباری برای این مقدار تعیین می‌کند تا توسعه‌دهندگان از APIها و قابلیت‌های امنیتی جدید اندروید استفاده کنند.
نکته: اگر minSdkVersion را بیش از حد بالا ببرید، کاربران دارای گوشی‌های قدیمی‌تر نمی‌توانند اپلیکیشن شما را نصب کنند. در مقابل، اگر این مقدار را خیلی پایین تعیین کنید، ممکن است مجبور شوید برای نسخه‌های قدیمی اندروید، ترفندها و رفع ناسازگاری‌های زیادی اعمال کنید.

۲. مقادیر versionName و versionCode

versionName: این مقدار برای نمایش نسخهٔ اپلیکیشن به کاربر در مارکت‌ها یا دستگاه استفاده می‌شود (مثلاً “۱.۲.۰”).
versionCode: یک عدد صحیح است که در هر بار به‌روزرسانی اپلیکیشن باید افزایش یابد (مثلاً در هر تغییر نسخه، این عدد را یک واحد افزایش می‌دهیم). مارکت‌های اندرویدی از versionCode برای تشخیص نسخهٔ جدیدتر استفاده می‌کنند.
در انتشار (Deployment) و ساخت بسته نصبی در Flutter، حتماً مطمئن شوید که این دو مقدار در هر نسخه به‌روز شوند تا مارکت‌هایی نظیر گوگل پلی بتوانند به درستی نسخه جدید را تشخیص دهند.

۳. وابستگی‌ها (Dependencies)

در فایل build.gradle، بخشی به نام dependencies وجود دارد که کتابخانه‌های مورد نیاز شما را لیست می‌کند. برای جلوگیری از مشکلات سازگاری:

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

۴. سایر تنظیمات مهم در build.gradle

compileSdkVersion: نسخه‌ای که پروژهٔ شما از آن برای کامپایل شدن استفاده می‌کند. بهتر است این مقدار را همواره مطابق آخرین نسخهٔ اندروید منتشرشده توسط گوگل تنظیم کنید (مشروط بر این‌که کتابخانه‌های شما از آن پشتیبانی کنند).
buildTypes: بخش‌هایی نظیر debug و release را مدیریت می‌کند. می‌توانید در این قسمت تنظیماتی برای کوچک‌سازی (minify) و بهینه‌سازی کد (shrinkResources) اعمال کنید.
signingConfigs: همان‌طور که در بخش امضای دیجیتال توضیح داده شد، اطلاعات مربوط به keystore و کلید امضای شما در این قسمت تعریف می‌شود.

۵. نمونه پیکربندی در android/app/build.gradle

در فایل android/app/build.gradle شما ممکن است ساختاری مشابه زیر را مشاهده کنید:

android {
    compileSdkVersion 33

    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 21
        targetSdkVersion 33
        versionCode 2
        versionName "1.1"
    }

    buildTypes {
        release {
            // فعال سازی امضای دیجیتال
            signingConfig signingConfigs.release

            // در صورت نیاز فعال‌سازی کوچک‌سازی کد و منابع
            // minifyEnabled true
            // shrinkResources true
            // proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    
    // وابستگی‌های Gradle یا سایر تنظیمات...
}

dependencies {
    // لیست کتابخانه‌ها و پلاگین‌ها
    // implementation "..."
}

applicationId: شناسهٔ یکتای اپلیکیشن در اندروید است و در مارکت‌ها نیز با این شناسه منتشر می‌شود.
در بخش buildTypes.release می‌توانید تنظیمات اختصاصی مربوط به بستهٔ نهایی (مثل فعال‌سازی R8/ProGuard برای کوچک کردن حجم اپلیکیشن) را اعمال کنید.
با به‌روزرسانی و مدیریت درست فایل‌های Gradle، می‌توانید مطمئن شوید که اپلیکیشن شما در فرآیند انتشار (Deployment) و ساخت بسته نصبی در Flutter آمادهٔ انتشار در مارکت‌ها است. توجه به minSdkVersion، targetSdkVersion، versionCode، versionName و اطمینان از عدم تداخل کتابخانه‌ها، همگی از عوامل موفقیت در ساخت یک بستهٔ نصبی قابل اعتماد و پایدار محسوب می‌شوند.

آپلود در Google Play Store

زمانی که مراحل انتشار (Deployment) و ساخت بسته نصبی در Flutter را پشت سر گذاشته‌اید و خروجی نهایی اپلیکیشن (فایل APK یا AAB) را ساخته و امضای دیجیتال را نیز اعمال کرده‌اید، گام بعدی انتشار در گوگل پلی است. برای این کار، باید از سرویس Google Play Console استفاده کنید که در ادامه جزئیات دقیق آن توضیح داده شده است:

۱. ایجاد حساب توسعه‌دهنده گوگل پلی

ورود به صفحه کنسول گوگل پلی:

به آدرس Google Play Console بروید. اگر از قبل حساب گوگل دارید، می‌توانید با همان حساب وارد شوید؛ در غیر این صورت، ابتدا باید یک حساب گوگل بسازید.
ثبت‌نام و پرداخت هزینه:
برای ساخت حساب توسعه‌دهنده، یک هزینهٔ اولیه (معمولاً ۲۵ دلار) دریافت می‌شود. این هزینه به صورت یک‌باره پرداخت می‌شود و پس از آن می‌توانید هر تعداد اپلیکیشن که بخواهید منتشر کنید.
تکمیل اطلاعات پروفایل:
اطلاعاتی مانند نام توسعه‌دهنده (یا شرکت)، آدرس ایمیل و سایر جزئیات را وارد کنید. در صورت تغییر شرایط یا قوانین، باید آن‌ها را بپذیرید و تأیید نمایید.
نکته: برای رعایت قوانین مالیاتی یا تحریم‌های احتمالی، بهتر است اطلاعات هویتی و مالی خود را به‌درستی وارد کنید تا در آینده دچار مشکل نشوید.

۲. ایجاد اپ جدید (Create App)

دسترسی به داشبورد اصلی:
پس از ایجاد حساب توسعه‌دهنده و ورود به پنل، داشبورد اصلی Google Play Console را مشاهده خواهید کرد.
گزینه‌ی Create App:
روی دکمهٔ Create App یا ایجاد برنامه کلیک کنید.
ورود اطلاعات اولیه:
نام برنامه (App name): نامی که در گوگل پلی نمایش داده می‌شود.
زبان پیش‌فرض (Default Language): زبانی که می‌خواهید برای توضیحات و محتوای اولیه ثبت شود.
دسته‌بندی و نوع برنامه: مشخص کنید که برنامه شما “App” است یا “Game” و آن را در یک دسته‌بندی (Category) مناسب قرار دهید.
نکته: نام اپلیکیشن را طوری انتخاب کنید که به راحتی توسط کاربران قابل جستجو باشد و از نظر قوانین گوگل نقض کپی‌رایت یا علائم تجاری نباشد.

۳. بارگذاری AAB یا APK

بخش Production یا Testing:
گوگل پلی انواع محیط‌های تست (Open testing، Closed testing) را فراهم کرده است. اگر قصد دارید ابتدا اپلیکیشن را در دسترس گروه محدودی از تست‌کنندگان قرار دهید، می‌توانید از Closed testing استفاده کنید. در غیر این صورت، برای انتشار عمومی، به بخش Production بروید.
آپلود فایل:
در بخش مربوطه، دکمهٔ Upload را خواهید دید. فایل AAB یا APK ساخته‌شده را (به حالت Drag & Drop یا از طریق انتخاب فایل) آپلود کنید.
تأیید صحت امضا و پکیج:
گوگل پلی فایل شما را بررسی می‌کند تا مطمئن شود امضای دیجیتال معتبری دارد و با قوانین مرتبط سازگار است.
اگر از AAB استفاده کنید، گوگل پلی به صورت خودکار APKهای بهینه را برای دستگاه‌های مختلف تولید می‌کند.
اگر از APK استفاده کنید، کل فایل همان‌طور که هست به عنوان بسته نصبی در اختیار کاربران قرار می‌گیرد.
نکته: در صورت استفاده از AAB، توصیه می‌شود فرایند Play App Signing را فعال کنید تا گوگل کلید امضای شما را مدیریت کند و باعث افزایش امنیت و راحتی به‌روزرسانی نسخه‌ها شود.

۴. تکمیل جزئیات انتشار

وارد کردن توضیحات و اسکرین‌شات‌ها:
Description: توضیحاتی دربارهٔ اپلیکیشن که به کاربر کمک می‌کند هدف و قابلیت‌های آن را بشناسد.
Short Description: خلاصه‌ای از ویژگی‌های اصلی که در صفحهٔ اپ نمایش داده می‌شود.
تصاویر و ویدئو: جهت جذب کاربران، اسکرین‌شات‌های باکیفیت از محیط برنامه و یک تریلر ویدئویی (در صورت داشتن) بارگذاری کنید.
ردیف و برچسب سنی (Content Rating):
بر اساس نوع اپلیکیشن، باید فرم محتوایی را پر کنید تا رده‌بندی سنی شما در گوگل پلی مشخص شود.
قیمت‌گذاری و توزیع (Pricing & Distribution):
اگر اپلیکیشن شما رایگان است، گزینهٔ Free را انتخاب کنید. در غیر این صورت، باید مشخصات مالی و قیمت در مناطق مختلف را وارد کنید.
سایر جزئیات:
Privacy Policy (سیاست حفظ حریم خصوصی): اگر اطلاعات کاربر را جمع‌آوری می‌کنید، لازم است یک لینک سیاست حفظ حریم خصوصی ارائه دهید.
Categorization: دسته‌بندی برنامه باید متناسب با محتوای آن باشد.

۵. ارسال اپ برای بررسی

بررسی اطلاعات تکمیلی:
قبل از نهایی کردن ارسال، مطمئن شوید که هیچ قسمتی از اطلاعات فروشگاه (Store Listing) ناقص یا اشتباه نیست.
گزینهٔ Submit for Review یا Publish:
پس از تکمیل تمام مراحل، اپلیکیشن خود را برای بررسی توسط گوگل ارسال کنید.

مدت زمان بررسی:
این فرایند ممکن است از چند ساعت تا چند روز طول بکشد. گوگل اپلیکیشن شما را از نظر محتوایی و فنی بررسی می‌کند. در صورت مشاهدهٔ نقص یا تخطی از قوانین، ممکن است آن را رد کند یا برای اعمال تغییرات به شما اعلام کند.
انتشار در گوگل پلی:
در صورت تایید، اپلیکیشن شما در گوگل پلی منتشر می‌شود و از این پس برای کاربران قابل دانلود خواهد بود.
نکته: در صورت رد شدن (Rejected)، بخش «Policy» یا «Pre-launch report» را بررسی کنید و بر اساس راهنمایی‌های گوگل، تغییرات مورد نیاز را اعمال کرده و مجدداً اپلیکیشن را ارسال نمایید.

آپلود در Google Play Store یکی از مراحل مهم و نهایی در انتشار (Deployment) و ساخت بسته نصبی در Flutter محسوب می‌شود. با ساخت حساب توسعه‌دهنده، رعایت نکات امضای دیجیتال، انتخاب فرمت مناسب (APK یا AAB) و تکمیل صحیح اطلاعات در کنسول گوگل پلی، می‌توانید اپلیکیشن خود را در معرض دید میلیون‌ها کاربر قرار دهید. همیشه پیش از ارسال نهایی، مطمئن شوید محتوای برنامه با قوانین گوگل تطابق دارد و تمامی اطلاعات فروشگاه (اسکرین‌شات، توضیحات، سیاست حریم خصوصی و غیره) دقیق و کامل هستند. با طی این مراحل و پذیرفته شدن توسط گوگل، برنامهٔ شما منتشر خواهد شد و می‌توانید از طریق آمار و گزارش‌های کنسول، عملکرد آن را زیر نظر بگیرید و با به‌روزرسانی‌های بعدی، اپلیکیشن را بهبود بخشید.

ساخت IPA برای iOS

در بخش iOS از انتشار (Deployment) و ساخت بسته نصبی در Flutter، با توجه به سیاست‌های سخت‌گیرانهٔ اپل، نیاز به یک سری مقدمات از جمله حساب توسعه‌دهندهٔ اپل، استفاده از سیستم عامل macOS و نصب ابزارهای توسعهٔ iOS دارید. در ادامه، جزئیات این فرآیند را بررسی می‌کنیم:

 راه‌اندازی حساب توسعه‌دهنده اپل

ورود به وب‌سایت Apple Developer
به آدرس Apple Developer مراجعه کنید.

ساخت حساب توسعه‌دهنده (Apple ID)

در صورتی که از قبل حساب اپل (Apple ID) ندارید، یک حساب جدید ایجاد کنید. سپس با همان اپل آیدی وارد پرتال توسعه‌دهنده شوید.

انتخاب طرح مورد نیاز

فردی (Individual): هزینه سالانه (در حال حاضر ۹۹ دلار در سال) و مناسب برای توسعه‌دهندگان مستقل.
شرکتی (Company/Organization): هزینه سالانهٔ مشابه، اما با نیاز به ارائهٔ مدارک حقوقی شرکت. همچنین امکان افزودن چندین عضو تیم را خواهید داشت.

تأیید حساب و پرداخت هزینه

روند پرداخت هزینه و تأیید اطلاعات ممکن است چند روز زمان ببرد (به‌خصوص در حساب شرکتی). بعد از طی این مراحل، حساب توسعه‌دهندهٔ شما فعال می‌شود.
نکته: با داشتن حساب توسعه‌دهندهٔ فعال، می‌توانید اپلیکیشن‌های خود را در App Store منتشر یا آن‌ها را برای تست داخلی (TestFlight) یا توزیع سازمانی آماده کنید.

 ساخت پروفایل انتشار (Provisioning Profile)

پروفایل انتشار (Provisioning Profile) و گواهینامه‌ها (Certificates) از بخش‌های کلیدی برای ساخت و امضای دیجیتال اپلیکیشن‌های iOS هستند. این موارد تعیین می‌کنند کدام دستگاه‌ها و چه مجوزهایی برای اجرای اپلیکیشن شما وجود دارد.

ایجاد App ID

در پنل Apple Developer، به بخش Certificates, Identifiers & Profiles بروید و یک شناسه (App ID) منحصربه‌فرد برای اپلیکیشن خود ایجاد کنید. معمولاً در قالب بسته (Bundle ID) با فرمت معکوس دامنه (مثلاً com.example.myapp) تعریف می‌شود.

ساخت Certificate (گواهینامه)

برای امضای اپلیکیشن در حین انتشار، نیاز به گواهینامه دارید. می‌توانید یک CSR (Certificate Signing Request) از طریق Keychain Access در مک ایجاد کرده و در بخش Certificates بارگذاری کنید تا گواهینامهٔ توسعه‌دهنده یا توزیع (Distribution Certificate) ساخته شود.

تهیه Provisioning Profile

یک Provisioning Profile جدید ایجاد کنید و در حین این فرایند، App ID، گواهینامه (Certificate) و دستگاه‌های مجاز (در صورت استفاده برای تست فیزیکی) را انتخاب نمایید.
Development Profile برای نصب آزمایشی روی دستگاه‌های محدود استفاده می‌شود.
Distribution Profile (App Store / Ad Hoc) برای آماده‌سازی انتشار در App Store یا توزیع محدود در خارج از آن.

دانلود و نصب پروفایل

پس از ساخت، فایل provisioning profile را دانلود کرده و روی سیستم macOS خود نصب کنید (معمولاً با دوبار کلیک کردن، Xcode آن را شناسایی می‌کند). همچنین اطمینان پیدا کنید گواهینامهٔ ساخته‌شده نیز در Keychain Access شما موجود است.
نکته: هر بار که قصد ساخت خروجی (Archive) برای انتشار دارید، باید از یک Provisioning Profile معتبر همراه با گواهینامهٔ مناسب استفاده کنید.

 ساخت خروجی برای iOS

ساخت خروجی در حالت Release از طریق Flutter
وارد ترمینال شده و دستور زیر را در پوشهٔ اصلی پروژه Flutter خود اجرا کنید:

flutter build ios --release

این دستور، پروژهٔ شما را در حالت Release برای iOS بیلد می‌کند و پوشهٔ build/ios/ را ایجاد یا به‌روز می‌کند.

نکته: ممکن است با پیامی مبنی بر نصب پادها (CocoaPods) یا به‌روزرسانی آن‌ها مواجه شوید. در این صورت، دستور pod repo update یا pod install را در مسیر ios اجرا کنید.

باز کردن پروژه در Xcode
با استفاده از فایل Runner.xcworkspace در پوشهٔ ios، پروژه را در Xcode باز کنید. (اگر از Runner.xcodeproj استفاده کنید، ممکن است تنظیمات CocoaPods به درستی اعمال نشود.)

آرشیو کردن پروژه (Archive)

نوار بالای Xcode را بررسی کنید و نوع دستگاه را روی Any iOS Device یا Generic iOS Device قرار دهید.
از منوی Product گزینهٔ Archive را انتخاب کنید.
Xcode فرایند بیلد و آماده‌سازی یک آرشیو (فایل xcarchive) را آغاز می‌کند. در صورت موفقیت، پنجرهٔ Organizer باز می‌شود.

Validate و Distribute

در پنجرهٔ Organizer، آرشیو ساخته‌شده را انتخاب کنید.
روی Validate کلیک کنید تا مطمئن شوید همه چیز مطابق با قوانین اپل است.
سپس روی Distribute App بزنید و شیوهٔ انتشار را انتخاب نمایید (App Store Connect، Ad Hoc، Enterprise، و غیره).
نهایتاً Xcode فرآیند ساخت فایل IPA (iOS App) را تکمیل کرده و آن را به مسیری مشخص خروجی می‌دهد یا مستقیماً به App Store Connect آپلود می‌کند.
نکته: اگر قصد دارید از TestFlight برای تست اپلیکیشن پیش از انتشار عمومی استفاده کنید، در همین مرحله می‌توانید گزینهٔ Upload to App Store را انتخاب کرده و در App Store Connect اپلیکیشن را وارد مرحلهٔ TestFlight کنید.

نکات و ترفندها

تنظیم Bundle Identifier: در فایل Info.plist یا تنظیمات پروژهٔ Xcode، مطمئن شوید Bundle Identifier با App ID که در پرتال توسعه‌دهندهٔ اپل ساخته‌اید، مطابقت دارد.
مدیریت گواهینامه‌ها و پروفایل‌ها: گاهی اوقات، آپدیت‌های Xcode یا تغییر نسخه‌های macOS می‌تواند منجر به تداخل و مشکلات Provisioning Profile شود. در این صورت، ممکن است نیاز به بازسازی Certificate و Profile داشته باشید.
به‌روزرسانی نسخه: مشابه اندروید، بهتر است مقادیر CFBundleShortVersionString (نمایش نسخه) و CFBundleVersion (سریال بیلد) در هر انتشار جدید به‌روزرسانی شود تا فرآیند آپدیت در App Store هموار باشد.
فعال کردن قابلیت‌های خاص: اگر اپلیکیشن شما از ویژگی‌هایی مثل Push Notifications، App Groups، Background Modes یا In-App Purchases استفاده می‌کند، حتماً در پرتال توسعه‌دهنده و تنظیمات Xcode، این موارد را فعال کرده و Provisioning Profile متناسب را ایجاد کنید.

برای انتشار (Deployment) و ساخت بسته نصبی در Flutter برای iOS، حتماً یک مک با Xcode و ابزارهای iOS نصب‌شده نیاز دارید. بعد از ساخت حساب توسعه‌دهنده و ایجاد Provisioning Profile، دستور flutter build ios –release شما را به مرحلهٔ نهایی رسانده و با باز کردن پروژه در Xcode و آرشیو کردن (Archive)، می‌توانید فایل IPA بسازید یا مستقیماً در App Store Connect آپلود کنید. توجه به جزئیات گواهینامه، پروفایل‌ها و یکسان بودن Bundle ID و App ID برای موفقیت در این فرآیند حیاتی است.

آپلود در App Store

در فرایند انتشار (Deployment) و ساخت بسته نصبی در Flutter برای iOS، بعد از ساخت فایل IPA، نوبت به بارگذاری آن در App Store Connect و انتشار عمومی در App Store می‌رسد. اپل برای اطمینان از کیفیت و امنیت اپلیکیشن‌ها، مراحلی را جهت بررسی و تأیید نهایی در نظر گرفته است. در ادامه گام به گام به این مراحل می‌پردازیم:

۱. اتصال Xcode به حساب توسعه‌دهنده

باز کردن Xcode و مراجعه به تنظیمات حساب (Preferences)

در نوار بالای Xcode، روی منوی Xcode کلیک و گزینهٔ Preferences را انتخاب کنید.
به سربرگ Accounts بروید.

ورود به حساب Apple Developer

در پایین پنجره Accounts، دکمهٔ + را بزنید و گزینهٔ Apple ID را برگزینید.
با Apple ID و رمز عبور وارد شوید. (همان حسابی که در سایت Apple Developer ساختید)
اگر چند طرح توسعه‌دهنده (Individual/Company) دارید، اطمینان حاصل کنید طرح (Team) مناسب انتخاب شده باشد.
نکته: اتصال موفق Xcode به حساب توسعه‌دهنده باعث می‌شود اطلاعات گواهینامه‌ها (Certificates) و پروفایل‌های انتشار (Provisioning Profiles) به‌صورت خودکار در پروژهٔ شما قابل استفاده باشد.

۲. آرشیو کردن پروژه (Archive)

انتخاب دستگاه (Device) در Xcode
در نوار بالای Xcode، از منوی انتخاب دستگاه (Scheme)، مطمئن شوید گزینهٔ Any iOS Device یا Generic iOS Device انتخاب شده باشد. اگر یک شبیه‌ساز (Simulator) انتخاب کرده باشید، گزینهٔ آرشیو کردن فعال نخواهد شد.

آرشیو کردن

از منوی بالای Xcode، گزینهٔ Product > Archive را بزنید.
Xcode شروع به ساخت آرشیو (xcarchive) از پروژهٔ شما در حالت Release می‌کند.
در صورت موفقیت، پنجرهٔ Organizer باز می‌شود که لیستی از آرشیوهای پروژه‌ را نمایش می‌دهد.
نکته: اگر پیش از این دستور flutter build ios –release را در ترمینال اجرا کرده باشید، برخی فایل‌های مورد نیاز (از جمله فایل‌های پیش‌ساختهٔ Swift/Objective-C) آماده خواهند بود. اما حتی در صورت عدم اجرای آن، Xcode به‌تنهایی می‌تواند فرایند بیلد را تکمیل کند.

۳. انتخاب Distribute App

باز کردن پنجرهٔ Organizer

بعد از اتمام آرشیو، به‌صورت خودکار پنجرهٔ Organizer باز می‌شود. اگر بنا به هر دلیل این پنجره بسته شد، از منوی Window > Organizer آن را مجدداً باز کنید.
کلیک روی Distribute App
در لیست آرشیوها، آخرین نسخه (با تاریخ و زمان تازه) را انتخاب کنید و دکمهٔ Distribute App را بزنید.
انتخاب گزینهٔ App Store Connect
در پنجره‌ای که باز می‌شود، چند گزینه برای توزیع (Distribution) وجود دارد:
App Store Connect (برای انتشار عمومی یا TestFlight)
Ad Hoc (برای توزیع محدود خارج از App Store)
Enterprise (برای سازمان‌ها)
و …
برای انتشار در App Store (یا استفاده از TestFlight)، گزینهٔ App Store Connect را انتخاب کنید.
نکته: اگر پیش از این اطلاعات Provisioning Profile و گواهینامه (Certificate) را به درستی تنظیم کرده باشید، Xcode از آن‌ها جهت امضای دیجیتال فایل IPA استفاده می‌کند.

۴. بارگذاری اپ در App Store Connect

مرحله Validate (اعتبارسنجی)
معمولاً Xcode پیش از آپلود نهایی، فرایندی به نام Validate را انجام می‌دهد تا مطمئن شود همه چیز مطابق قوانین اپل (مانند نسخهٔ Bundle ID، شماره نسخه، امضای گواهینامه و …) است.
آپلود نهایی (Upload)
بعد از تأیید شدن در مرحلهٔ Validate، نوبت آپلود فایل IPA است. Xcode با استفاده از اطلاعات حساب شما، فایل را در App Store Connect بارگذاری می‌کند.
پیام موفقیت
در صورت اتمام موفقیت‌آمیز، Xcode پیام Upload Complete را نشان می‌دهد. اکنون می‌توانید در پنل آنلاین App Store Connect مشاهده کنید که بیلد جدید شما ثبت شده است.
نکته: اگر قصد توزیع آزمایشی از طریق TestFlight را دارید، در همین مرحله می‌توانید اقدام کنید تا بیلد شما ابتدا برای تست داخلی یا خارجی در TestFlight قابل دسترسی باشد.

۵. تکمیل اطلاعات انتشار در App Store Connect

ورود به App Store Connect
در مرورگر، به آدرس App Store Connect رفته و با Apple ID لاگین کنید.
انتخاب برنامه
از داشبورد اصلی، اپلیکیشنی را که می‌خواهید اطلاعات آن را تکمیل کنید انتخاب کنید. اگر برای اولین بار است که این اپ را ایجاد می‌کنید، از بخش My Apps یک برنامه جدید بسازید و مراحل اولیه (ایجاد Bundle ID، انتخاب پلتفرم iOS و …) را انجام دهید.
تکمیل جزئیات صفحهٔ App Store
نام، توضیحات و اسکرین‌شات: تصاویر با کیفیت از رابط کاربری اپ، آیکن و ویدئو (اختیاری) در صورت تمایل. باید مطابق با ابعاد و رزولوشن مورد نیاز برای هر دستگاه (iPhone، iPad، و غیره) باشد.
تعیین دسته‌بندی: بر اساس نوع اپ (مثلاً بازی، تجارت، ابزارها و …).
رده‌بندی سنی (Content Rating): فرمی را پر می‌کنید تا اپل بر اساس محتوای اپ، سن مناسب برای استفاده را تشخیص دهد.

ورود اطلاعات ساخت (Build Information)

در بخش Build، بیلدی را که از Xcode آپلود کردید، انتخاب کنید. (البته باید وضعیت بیلد از حالت پردازش App Store عبور کرده باشد، که چند دقیقه تا چند ساعت ممکن است طول بکشد.)
نکته: ممکن است پس از آپلود، وضعیت بیلد در حالت Processing قرار بگیرد. پس از پایان این مرحله، می‌توانید بیلد را انتخاب کنید.

۶. ارسال برای بررسی (Submit for Review)

بررسی نهایی اطلاعات
پیش از ارسال نهایی، مطمئن شوید تمامی موارد (توضیحات، اسکرین‌شات‌ها، کلمات کلیدی، دسته‌بندی، قیمت‌گذاری و تاریخ انتشار) به‌درستی تکمیل شده‌اند.
گزینهٔ Submit for Review یا Submit to App Review
دکمه‌ای در بخش نسخهٔ جدید (New Version) وجود دارد که به شما اجازه می‌دهد اپلیکیشن را برای بررسی به اپل ارسال کنید.
مدت زمان بررسی
اپل معمولاً بین چند ساعت تا چند روز برای بررسی اپلیکیشن شما زمان می‌گذارد. در صورت وجود هرگونه مشکل یا نقض قوانین، اپلیکیشن رد (Rejected) و دلیل آن اعلام می‌شود. در این صورت باید مشکل را رفع کرده و دوباره بیلد جدیدی آپلود کنید.

انتشار نهایی در App Store

پس از تأیید اپلیکیشن از طرف اپل، گزینهٔ Release فعال می‌شود یا در زمان‌بندی که تعیین کرده‌اید، اپلیکیشن به صورت عمومی منتشر می‌شود. کاربران می‌توانند از طریق App Store آن را دریافت کنند.
نکته: در صورتی که اپلیکیشن شما رد شود، در قسمت Resolution Center توضیحات اپل درباره علت رد شدن را مشاهده خواهید کرد. بعد از اعمال اصلاحات لازم، نسخهٔ جدید را آپلود کرده و مجدداً Submit کنید. آپلود در App Store یکی از بخش‌های مهم و حساس در انتشار (Deployment) و ساخت بسته نصبی در Flutter برای iOS است. از ساخت حساب توسعه‌دهنده و Provisioning Profile گرفته تا تنظیمات Xcode و تکمیل اطلاعات در App Store Connect، همگی باید با دقت انجام شود. همچنین رعایت استانداردهای کیفی و قوانین سخت‌گیرانهٔ اپل در طراحی UI، محتوا، مجوزها و حریم خصوصی می‌تواند از رد شدن‌های متوالی جلوگیری کند. پس از تأیید نهایی، اپلیکیشن شما برای میلیون‌ها کاربر دستگاه‌های iOS قابل دسترسی خواهد بود.

وب و دسکتاپ در Flutter

علاوه بر توسعه اپلیکیشن‌های موبایل (اندروید و iOS)، انتشار (Deployment) و ساخت بسته نصبی در Flutter این امکان را فراهم کرده است تا با کمترین تغییر در کد، خروجی وب و دسکتاپ نیز تهیه شود. در ادامه، نکات مهم پیرامون ساخت و استقرار (Deployment) برای هرکدام توضیح داده می‌شود.

ساخت خروجی وب (Web)

فعال کردن وب در Flutter
دستور زیر را در ترمینال اجرا کنید:

flutter config --enable-web
flutter devices

با اجرای دستور flutter devices می‌توانید ببینید آیا پلتفرم وب در لیست دستگاه‌های قابل دسترس قرار گرفته است یا خیر.
در صورت نصب نبودن SDKهای ضروری یا عدم وجود نسخه‌های جدید، ممکن است نیاز به بروزرسانی Flutter داشته باشید:

flutter upgrade

ساخت خروجی وب
از داخل پوشهٔ پروژهٔ Flutter، دستور زیر را وارد کنید:

flutter build web

این دستور پوشهٔ build/web را تولید می‌کند. محتوای این پوشه شامل فایل‌های HTML، JavaScript و CSS است که مرورگر برای اجرای برنامهٔ Flutter به آن‌ها نیاز دارد.
مزیت اصلی خروجی تحت وب آن است که کاربران بدون نیاز به نصب اپلیکیشن، تنها با ورود به آدرس وب‌سایت می‌توانند از برنامه استفاده کنند.
راه‌اندازی روی وب سرور
پوشهٔ build/web را در هاست یا سرور مورد نظر آپلود کنید. فایل index.html به‌عنوان نقطهٔ ورودی برای اپلیکیشن Flutter شما عمل می‌کند.
وب‌سرورهایی مانند Nginx، Apache، Firebase Hosting یا Netlify می‌توانند برای میزبانی این فایل‌ها استفاده شوند.
در برخی سرورها، ممکن است نیاز به پیکربندی فایل .htaccess یا تنظیمات روتینگ داشته باشید تا درخواست‌ها را به درستی به فایل index.html هدایت کنید.
نکته: اگر برنامهٔ شما از مسیرهای ناوبری (Routing) در Flutter Web استفاده می‌کند، بهتر است پیکربندی لازم برای پشتیبانی از مسیرهای سفارشی (URL Rewriting) را در سرور نیز اعمال کنید.

ساخت خروجی دسکتاپ (Windows، macOS، Linux)

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

ویندوز:

flutter config --enable-windows-desktop
flutter devices

macOS:

flutter config --enable-macos-desktop
flutter devices

Linux:

flutter config --enable-linux-desktop
flutter devices

پس از فعال کردن هر پلتفرم و نصب پیش‌نیازهای مربوطه (مثل ابزارهای توسعهٔ CMake، Visual Studio Build Tools برای ویندوز، Xcode برای مک و …)، با اجرای دستور flutter devices باید پلتفرم دسکتاپ در فهرست دستگاه‌های قابل دسترس نمایش داده شود.

ساخت خروجی دسکتاپ
برای ویندوز:

flutter build windows

در مسیر build/windows/runner/Release یا build/windows/ (بسته به نسخهٔ Flutter) فایل اجرایی (.exe) تولید می‌شود.
برای macOS:

flutter build macos

یک فولدر حاوی فایل اجرایی (فایل .app) در build/macos/Build/Products/Release ایجاد می‌شود.
برای Linux:

flutter build linux

 

در پوشهٔ build/linux/ یک فایل اجرایی (معمولاً بدون پسوند یا با پسوند خاص توزیع) ساخته می‌شود.

فایل اجرایی و انتشار

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

Windows: معمولاً یک .exe به همراه سایر کتابخانه‌های مورد نیاز (DLL) در یک فولدر قرار دارد.
macOS: یک فایل .app که می‌توانید با دوبار کلیک آن را اجرا کنید.
Linux: یک فایل اجرایی که ممکن است نیاز به دسترسی اجرایی (chmod +x <filename>) داشته باشد.

روش‌های انتشار:

اشتراک‌گذاری مستقیم: می‌توانید فولدر حاوی فایل اجرایی را فشرده (zip) کرده و در اختیار کاربران قرار دهید تا آن را روی سیستم خود استخراج و اجرا کنند.
فروشگاه‌های نرم‌افزاری: برای ویندوز، امکان انتشار در Microsoft Store وجود دارد. در macOS، می‌توانید با فرآیند Notarization اپل و انتشار در Mac App Store آشنا شوید. برای لینوکس نیز بسته به توزیع می‌توانید پکیج (DEB، RPM یا SNAP) بسازید و آن را منتشر کنید.
ابزارهای بسته‌بندی: ابزارهایی مانند fpm یا Snapcraft می‌توانند برای بسته‌بندی پروژه در قالب‌های مرسوم لینوکس کمک کنند.
نکته: برخی پلاگین‌ها یا کتابخانه‌هایی که به ویژگی‌های خاص موبایل (GPS، حسگرها و …) متکی هستند، ممکن است روی دسکتاپ پشتیبانی نشوند یا نیازمند جایگزین باشند. پیش از انتشار نهایی، حتماً ویژگی‌های اپلیکیشن خود را روی هر پلتفرم تست کنید. با استفاده از انتشار (Deployment) و ساخت بسته نصبی در Flutter نه‌تنها می‌توانید خروجی اندروید و iOS داشته باشید، بلکه با کمترین تغییر، نسخه‌های تحت وب و دسکتاپ را نیز در اختیار کاربران قرار دهید. فعال‌سازی پلتفرم مورد نظر، اجرای دستورهای بیلد و سپس استقرار فایل خروجی روی سرور وب یا به‌صورت فایل اجرایی دسکتاپ، اصلی‌ترین مراحل این فرایند هستند. توجه داشته باشید که هر پلتفرم، نیازمندی‌ها و محدودیت‌های خودش را دارد و باید پیش از انتشار نهایی، همه قابلیت‌های اپلیکیشن به‌طور کامل آزموده شود تا تجربه کاربری یکپارچه و بدون مشکل ارائه گردد.

بررسی ویژگی‌های تحت حمایت در هر پلتفرم

یکی از موارد مهم در انتشار (Deployment) و ساخت بسته نصبی در Flutter این است که قابلیت‌ها و پلاگین‌های مورد استفاده، ممکن است در همهٔ پلتفرم‌ها (اندروید، iOS، وب و دسکتاپ) به یک اندازه پشتیبانی نشوند. در نتیجه، پیش از انتشار نهایی، ضروری است که تفاوت‌ها و محدودیت‌های هر پلتفرم را شناخته و برنامه را روی تمام پلتفرم‌های هدف تست کنید. در ادامه، برخی از نکات کلیدی مرتبط با این موضوع بررسی می‌شوند.

۱. اندروید

امکانات سخت‌افزاری متنوع: بسیاری از پلاگین‌ها برای دسترسی به سنسورهایی مانند دوربین، GPS، شتاب‌سنج و مواردی از این دست روی اندروید پیاده‌سازی شده‌اند.
مجوزها (Permissions): در اندروید، هنگام استفاده از قابلیت‌هایی نظیر موقعیت مکانی، دوربین و … باید در فایل AndroidManifest.xml مجوز مورد نیاز را تعریف کرده و در زمان اجرا نیز آن را درخواست کنید.
سازگاری با نسخه‌های مختلف: چون تنوع دیوایس‌ها و نسخه‌های اندروید بالاست، بهتر است minSdkVersion را با توجه به قابلیت‌های استفاده شده و نیازمندی‌های پروژه تنظیم کنید.

۲. iOS

سیاست‌های سخت‌گیرانهٔ اپل: اپل بر روی حریم خصوصی کاربران و استفاده از منابع حساس مانند بلوتوث، موقعیت مکانی و دوربین بسیار حساس است. لذا در صورت استفاده از این قابلیت‌ها باید توضیحات مربوطه (Privacy Usage Description) را در فایل Info.plist قرار دهید.
محدودیت‌های انتشار در App Store: رعایت قوانین App Store، کیفیت UI، محتوای مناسب و امنیت اپلیکیشن از شروط اساسی اپل است. در صورت عدم رعایت این موارد، احتمال رد شدن اپلیکیشن وجود دارد.
انحصاری بودن محیط توسعه: برای ساخت و انتشار اپلیکیشن روی iOS، حتماً نیاز به macOS و ابزارهایی نظیر Xcode دارید.

۳. وب

محدودیت در دسترسی به سخت‌افزار: مرورگرها برای حفظ امنیت کاربران، دسترسی به برخی قابلیت‌های سیستمی (مانند بلوتوث، GPS و فایل سیستم عمیق) را محدود یا نیازمند مجوز کاربر کرده‌اند.
عملکرد (Performance): در مقایسه با نسخهٔ موبایل/دسکتاپ، اجرای انیمیشن‌ها یا پردازش‌های سنگین در وب می‌تواند کمی کندتر باشد، چراکه همه چیز از طریق JavaScript و WebAssembly در محیط مرورگر اجرا می‌شود.
تنظیمات ریسپانسیو: برای نمایش بهتر روی مرورگر، تنظیمات ریسپانسیو در طراحی صفحات و ویجت‌ها اهمیت بیشتری دارد.

۴. دسکتاپ (Windows، macOS، Linux)

تعامل با فایل سیستم: بر خلاف وب که دسترسی محدودی به فایل سیستم دارد، اپلیکیشن‌های دسکتاپ می‌توانند مستقیماً به فایل‌های محلی سیستم دسترسی داشته باشند. این قابلیت مناسب برای ابزارهای مدیریت فایل، ویرایشگرها یا نرم‌افزارهای سازمانی است.
نصب و توزیع متفاوت: در ویندوز می‌توانید فایل .exe یا پکیج MSI ارائه دهید، در مک لازم است فایل .app را Notarize کنید تا در Gatekeeper مسدود نشود و در لینوکس می‌توانید از پکیج‌هایی مانند DEB، RPM یا Snap استفاده کنید.
پلاگین‌ها و کتابخانه‌ها: برخی از پلاگین‌های Flutter ممکن است هنوز از دسکتاپ پشتیبانی نکنند یا در مراحل اولیه توسعه باشند. حتماً پیش از استفاده، مستندات پلاگین را بررسی کرده و تست عملی انجام دهید.

۵. نکاتی برای اطمینان از پشتیبانی مناسب

بررسی مستندات پلاگین: پیش از استفاده از هر پلاگین، بخش Supported Platforms در مستندات آن را مطالعه کنید.
استفاده از شرط‌های پلتفرمی (Platform Checks): در صورت نیاز می‌توانید با استفاده از Platform.isAndroid، Platform.isIOS، kIsWeb و غیره، قابلیت‌های خاص هر پلتفرم را جداگانه پیاده‌سازی کنید تا از بروز خطا در پلتفرم‌های دیگر جلوگیری شود.
آزمون عملی (Real Testing): حتی اگر مستندات پلاگین ادعای پشتیبانی از چند پلتفرم را داشته باشد، اجرای اپلیکیشن روی دستگاه واقعی یا شبیه‌ساز هر پلتفرم (Android Emulator، iOS Simulator، وب روی مرورگرهای مختلف، دسکتاپ‌های متفاوت) لازم است.
بازخورد و گزارش باگ‌ها: در صورت مواجهه با مشکلی خاص در یک پلتفرم، در مخزن گیت‌هاب مربوط به آن پلاگین یا در انجمن‌های Flutter، باگ را گزارش دهید تا در نسخه‌های آتی رفع شود.

در فرآیند انتشار (Deployment) و ساخت بسته نصبی در Flutter، پشتیبانی کتابخانه‌ها و پلاگین‌ها در پلتفرم‌های مختلف یک فاکتور کلیدی است. گاهی ویژگی‌ها یا کتابخانه‌هایی که روی اندروید و iOS به‌خوبی کار می‌کنند، روی وب یا دسکتاپ دچار محدودیت می‌شوند. همچنین قوانین اپ‌استورها (مانند Google Play و App Store) و نیازمندی‌های امنیتی (مثلاً در وب) می‌توانند بر نحوه پیاده‌سازی قابلیت‌ها تأثیر بگذارند. در نهایت، با تست مداوم در هر پلتفرم و آگاهی از محدودیت‌ها، می‌توانید تجربهٔ کاربری مطلوب‌تری را در اختیار مخاطبان خود قرار دهید.

نتیجه‌گیری

با توجه به مطالبی که در این مقاله ارائه شد، فرایند انتشار (Deployment) و ساخت بسته نصبی در Flutter نه تنها برای پلتفرم‌های موبایل (اندروید و iOS)، بلکه برای وب و دسکتاپ نیز امکان‌پذیر است. درک مراحل ایجاد امضای دیجیتال، پیکربندی فایل‌های Gradle و Xcode، شناخت محدودیت‌ها و نیازمندی‌های هر پلتفرم و تست مداوم، همگی از عوامل کلیدی برای ارائهٔ یک محصول نهایی با کیفیت هستند. با رعایت این نکات، می‌توانید اپلیکیشن خود را به‌صورت امن، بهینه و حرفه‌ای در دسترس طیف گسترده‌ای از کاربران قرار دهید.

آموزش انتشار (Deployment) و ساخت بسته نصبی در Flutter

دیدگاه های شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *