في عالم نشر التطبيقات، توقيع تطبيق Flutter ، بل هو صك الثقة بينك وبين المستخدمين.
فالتطبيق غير الموقّع يُعامل كملف مجهول المصدر، وقد يُرفض من المتجر أو حتى من أنظمة التشغيل.
في هذا المقال، سنغوص في مفهوم توقيع التطبيقات (App Signing) داخل Flutter — ما هو، ولماذا هو مهم، وكيف تنفّذه بشكل صحيح على Android و iOS.
أولًا: ما هو توقيع التطبيق ولماذا نحتاجه؟
تخيل أن لديك رسالة سرّية تريد إرسالها، وتريد أن يعرف المستلم أنها منك حقًا ولم يعبث بها أحد.
هنا يأتي دور التوقيع الرقمي (Digital Signature).
في حالة التطبيقات:
- Android يستخدم ملف Keystore لتوقيع حزمة التطبيق.
- iOS يستخدم Certificates و Profiles للتأكد من هوية المطور.
ببساطة:
التوقيع هو شهادة تثبت أن التطبيق صُمّم ورفع من طرفك، وليس من جهة مجهولة.
ثانيًا: توقيع تطبيقات Android (Keystore)
🪪 1. إنشاء Keystore جديد
افتح الطرفية داخل مشروعك واكتب:
keytool -genkey -v -keystore my-key.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias my-key
سيُطلب منك:
- الاسم الكامل
- المؤسسة
- المدينة
- الدولة
- كلمة مرور keystore
بعدها ستحصل على ملف my-key.keystore — وهو ملف التوقيع الأساسي لتطبيقك.
احفظه في المسار:
android/app/
2. إعداد ملف key.properties
أنشئ ملفًا داخل مجلد android/ باسم key.properties يحتوي على:
storePassword=كلمة_مرور_الملف
keyPassword=كلمة_مرور_المفتاح
keyAlias=my-key
storeFile=app/my-key.keystore
3. تعديل build.gradle لربط المفتاح
افتح الملف:
android/app/build.gradle
وأضف التالي داخل القسم android { ... }:
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
shrinkResources true
}
}
4. بناء التطبيق الموقّع
الآن يمكنك بناء إصدار موقّع رسميًا عبر:
flutter build appbundle
سيقوم Flutter بتوقيع التطبيق باستخدام keystore تلقائيًا.
النتيجة: ملف .aab جاهز للرفع إلى Google Play.
💡 لا تشارك ملف keystore أو كلمته مع أي شخص.
فقد يؤدي ضياعه إلى استحالة رفع التحديثات المستقبلية!
ثالثًا: توقيع تطبيقات iOS (Certificates & Profiles)
على نظام iOS، الأمر يتم عبر شهادات رقمية تصدرها Apple نفسها.
1️⃣ إنشاء حساب مطور Apple
سجّل في Apple Developer (بتكلفة 99 دولار سنويًا).
2️⃣ إنشاء Certificate
من لوحة التحكم:
- اختر Certificates, Identifiers & Profiles
- ثم أنشئ شهادة من نوع iOS Distribution
- وقم بتحميل ملف
.cerالناتج
3️⃣ إنشاء Provisioning Profile
- اربط الشهادة بالتطبيق عبر معرفه (Bundle ID)
- قم بتحميل الملف الناتج
.mobileprovision
4️⃣ إعداد Xcode للتوقيع
افتح مشروع Flutter في Xcode:
open ios/Runner.xcworkspace
ثم:
- من قسم Signing & Capabilities
- فعّل Automatically manage signing
- اختر حسابك المطور
سيقوم Xcode تلقائيًا بربط الملفات المطلوبة بالتطبيق.
رابعًا: الفرق بين التوقيع أثناء التطوير والإصدار
| النوع | الغرض | المفاتيح المستخدمة |
|---|---|---|
| Debug | للتجربة فقط على الأجهزة المحلية | مفتاح مؤقت (debug.keystore) |
| Release | للنشر في المتاجر الرسمية | مفتاحك الخاص (release.keystore أو Certificate) |
خامسًا: التوقيع التلقائي في Flutter
بدءًا من إصدارات Flutter الحديثة، يمكنك إدارة التوقيع بسهولة دون الدخول في تعقيدات Xcode أو Gradle.
بمجرد إعداد key.properties أو ربط حساب Apple Developer، فإن Flutter يتكفل بالباقي أثناء عملية:
flutter build appbundle
flutter build ipa
سادسًا: ماذا يحدث إذا فقدت مفتاح التوقيع؟
كارثة صغيرة 😅
إذا فقدت keystore أو certificate:
- لن يمكنك تحديث التطبيق على المتجر.
- يجب رفعه كـ تطبيق جديد بعنوان جديد.
لذا احفظ نسخًا احتياطية من مفاتيحك في مكان آمن (مثل Google Drive المشفّر أو GitHub Secrets).
الخلاصة
توقيع التطبيق هو مرحلة الأمان والثقة قبل النشر.
هو بمثابة توقيعك الشخصي الذي يخبر Google وApple:
“أنا المطور الشرعي لهذا التطبيق.”
باتباع الخطوات السابقة، تضمن أن تطبيقك مؤمّن، احترافي، ومستعد للظهور في المتاجر الرسمية دون مشاكل.
وفي المقال القادم من السلسلة، سنتناول المرحلة التالية:
رفع التطبيقات إلى المتاجر (App Stores) — كيف يتم، ما المتطلبات، وكيف تجهز وصفك وصورك ليجذب المستخدمين فورًا 🚀

