البناء والإصدار والنشر على متاجر التطبيقات
البناء والإصدار والنشر على متاجر التطبيقات
إرسال تطبيق Flutter إلى متجر Google Play أو App Store من Apple هو الإنجاز النهائي لأي مشروع إنتاجي. يستعرض هذا الدرس خط أنابيب الإصدار الكامل: ضبط توقيع الكود لأندرويد وiOS، وتعيين بيانات الإصدار، وإنتاج بنيات إصدار محسّنة، والتنقل عبر سير عمل الإرسال في كلا المتجرين.
تحديد إصدار تطبيقك
يتحكم Flutter في الإصدار المعروض للمستخدمين وعداد البناء الداخلي من خلال سطر واحد في pubspec.yaml:
pubspec.yaml — حقل الإصدار
# version: <إصدار مرئي للمستخدم>+<رقم البناء>
version: 1.2.0+5
# يُعيَّن إلى:
# Android: versionName="1.2.0" versionCode=5
# iOS: CFBundleShortVersionString=1.2.0 CFBundleVersion=5
الجزء قبل + هو إصدار التسويق (المعروض في المتاجر). العدد الصحيح بعد + هو رقم البناء — يجب زيادته مع كل رفع إلى أي من المتجرين. يمكنك تجاوز هذه القيم من سطر الأوامر عند وقت البناء:
تجاوز الإصدار عند وقت البناء
flutter build apk \
--build-name=1.2.0 \
--build-number=5
أندرويد: التوقيع باستخدام Keystore
يجب توقيع كل APK أو App Bundle لأندرويد بمفتاح خاص. تُنشئ keystore مرة واحدة وتعيد استخدامها طوال عمر تطبيقك — فقدان keystore يعني أنك لن تستطيع تحديث تطبيقك على متجر Play أبداً.
1 — توليد keystore (تشغيل مرة واحدة)
keytool -genkey -v \
-keystore ~/keys/my-release-key.jks \
-keyalg RSA -keysize 2048 \
-validity 10000 \
-alias my-key-alias
احتفظ بملف .jks المولَّد وكلمات مروره في مكان آمن (مدير كلمات مرور أو نسخة احتياطية مشفرة). بعد ذلك، أنشئ android/key.properties — أضف هذا الملف إلى .gitignore فوراً:
android/key.properties
storePassword=yourStorePassword
keyPassword=yourKeyPassword
keyAlias=my-key-alias
storeFile=/Users/you/keys/my-release-key.jks
أخيراً، حدّث 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))
}
android {
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
shrinkResources true
}
}
}
key.properties أو keystore بامتداد .jks مطلقاً في مستودع git. أي شخص يمتلك تلك الملفات يستطيع نشر تحديثات لتطبيقك متظاهراً بأنه أنت. أضف كليهما إلى .gitignore وخزّنهما في قبو آمن.بناء إصدار أندرويد موقَّع
يطلب متجر Google Play App Bundle (.aab) بدلاً من APK عادي للتطبيقات الجديدة. يتيح App Bundle للمتجر تسليم APKs محسّنة لكل بنية معالج وكثافة شاشة، مما يقلل أحجام التنزيل.
بناء App Bundle موقَّع
# المفضل لإرسال Play Store
flutter build appbundle --release
# المخرج: build/app/outputs/bundle/release/app-release.aab
# للتوزيع المباشر عبر APK (للتثبيت الجانبي / الاختبار)
flutter build apk --release --split-per-abi
# المخرجات: build/app/outputs/flutter-apk/
# app-armeabi-v7a-release.apk
# app-arm64-v8a-release.apk
# app-x86_64-release.apk
iOS: الشهادات وملفات التوفير
يتطلب توقيع كود iOS حساب Apple Developer. تتضمن العملية ثلاثة عناصر:
- شهادة التوقيع — تثبت هويتك كمطوّر (شهادة التوزيع لـ App Store).
- معرف التطبيق (Bundle Identifier) — سلسلة نطاق عكسية فريدة مسجَّلة في بوابة Apple Developer (مثل
com.example.myapp). - ملف التوفير — يربط شهادتك بمعرف التطبيق وبـ UDIDs الأجهزة (للتوزيع المخصص). استخدم ملف App Store Distribution للإرسال.
في Xcode، افتح ios/Runner.xcworkspace، اختر هدف Runner، وتحت Signing & Capabilities اختر فريقك. مع تفعيل Automatically manage signing، يقوم Xcode بتنزيل الشهادات وملفات التوفير وتحديثها تلقائياً.
match من Fastlane لمزامنة الشهادات وملفات التوفير من مستودع git خاص أو دلو Google Cloud Storage. هذا يُبقي جميع الأجهزة متزامنة دون تدخل يدوي في Xcode.بناء إصدار iOS موقَّع
بناء أرشيف iOS لإرسال App Store
# البناء مع توقيع Xcode
flutter build ipa --release
# يوضع ملف .ipa في:
# build/ios/ipa/<AppName>.ipa
# إذا احتجت تحديد طريقة التصدير صراحةً:
flutter build ipa \
--export-options-plist=ios/ExportOptions.plist
ارفع ملف .ipa الناتج إلى App Store Connect باستخدام Xcode Organizer (Product > Archive > Distribute App) أو أدوات CLI للأوامر xcrun altool / xcrun notarytool. بديلاً، استخدم Transporter (تطبيق Apple المجاني) للرفع بالسحب والإفلات.
قائمة تدقيق إرسال Google Play Store
- أنشئ تطبيقاً جديداً في Google Play Console واملأ قائمة المتجر (لقطات الشاشة، الوصف، تصنيف المحتوى).
- ارفع
app-release.aabإلى مسار Internal Testing أولاً للتحقق منه، ثم رقِّيه إلى Production. - اضبط نسبة طرح (مثلاً 10%) للإصدارات المرحلية حتى تتمكن من اكتشاف الأعطال قبل الوصول إلى جميع المستخدمين.
- تأكد أن
versionCodeأكبر صراحةً من الرفع السابق وإلا سيُرفض الرفع.
قائمة تدقيق إرسال Apple App Store
- في App Store Connect، أنشئ إصدار تطبيق جديداً واملأ نص What's New ولقطات الشاشة (بأحجام أجهزة متعددة) ومعلومات مراجعة التطبيق.
- ارفع
.ipaوانتظر المعالجة (عادةً 5–30 دقيقة). - اختر البنية في صفحة الإصدار وأرسل للمراجعة. متوسط وقت المراجعة 24–48 ساعة.
- تأكد أن
CFBundleVersion(رقم البناء) أكبر صراحةً من أي بنية مرفوعة سابقاً — حتى تلك المرفوضة تُحسب.