انتقل إلى المحتوى
تحديثات التطبيقات

مستوى API المستهدف 36 على Google Play: تمديد 1 نوفمبر 2026 وطريقة الإصلاح في Expo وFlutter وReact Native

فاتك موعد 31 أغسطس؟ اعرف ما الذي لا يزال تمديد 1 نوفمبر 2026 يمنحك إياه، ثم انقل تطبيق Expo أو Flutter أو React Native إلى API 36 دون أن تتعطل أزرار الرجوع أو التخطيطات.

الإجابة المختصرة

تنص قاعدة مستوى API المستهدف 36 على أنه منذ 31 أغسطس 2026 يجب أن يستهدف كل تطبيق جديد وكل تحديث يُرسَل إلى Google Play نظام Android 16 (API 36). وكان بإمكان المطورين الذين تلقت تطبيقاتهم تحذيرًا بشأن السياسة طلب تمديد حتى 1 نوفمبر 2026 من صفحة حالة السياسات (Policy status). وبعد انتهاء هذا التمديد يمنع Play التحديثات حتى ترفع إصدارًا بقيمة targetSdk 36. وتستهدف الإصدارات Expo SDK 54 فما فوق وFlutter 3.38 فما فوق وReact Native 0.81 فما فوق مستوى API 36 افتراضيًا.

أبرز النقاط
  • منذ 31 أغسطس 2026 يجب أن تستهدف التطبيقات الجديدة وتحديثات التطبيقات على Google Play نظام Android 16 (مستوى API 36). ويحتاج Wear OS وAutomotive إلى API 35، ويحتاج Android TV وXR إلى API 34.
  • لا يمتد التمديد إلا حتى 1 نوفمبر 2026. ويصل رابط نموذج طلبه إلى التطبيقات غير الملتزمة عبر إشعارات Play Console وعبر صفحة التحذير في Policy status.
  • إذا كان تطبيق هاتف قائم يستهدف API 35 أو أعلى، فإنه يظل متاحًا للمستخدمين الجدد. تفويت الموعد يوقف تحديثاتك، لا صفحة تطبيقك الحالية.
  • يستهدف Expo SDK 54 (مع React Native 0.81) وFlutter 3.38 مستوى API 36 افتراضيًا. والترقية عادةً أنجح من تعديل الرقم يدويًا.
  • عندما يستهدف التطبيق API 36، يتوقف Android عن استدعاء onBackPressed ويتجاهل أقفال الاتجاه على الشاشات التي يبلغ عرضها 600dp أو أكثر. اختبر التنقل للخلف وتخطيطات الأجهزة اللوحية قبل الرفع.
API 36 أو لا تحديثات

يعني اشتراط مستوى API المستهدف 36 على Google Play أن أي إصدار مبني لنسخة أقدم من Android 16 لا يمكن نشره. واعتبارًا من أكتوبر 2026، يرفض Play كل تطبيق جديد وكل تحديث يستهدف مستوى أدنى، وغالبًا مع الرسالة Target SDK of artifact is too low. وكان بإمكان التطبيقات التي تلقت تحذيرًا بشأن السياسة طلب مهلة إضافية، لكن التمديد ينتهي في 1 نوفمبر 2026. يشرح هذا الدليل ما الذي لا يزال التمديد يمنحك إياه، وكيف تنقل Expo وFlutter وReact Native إلى API 36، وما الذي يتعطل عادةً بعد ذلك.

ما الذي يمنعه اشتراط مستوى API المستهدف 36 فعليًا؟

إنه يمنع عمليات الإرسال. فمنذ 31 أغسطس 2026 لا يمكنك رفع تطبيق هاتف جديد أو تحديث ما لم يستهدف API 36. أما التطبيقات المنشورة بالفعل التي تستهدف API 35 أو أعلى فتظل متاحة بالكامل، بما في ذلك للمستخدمين الجدد.

وفقًا لصفحة متطلبات مستوى API المستهدف من Google: "يجب أن تستهدف التطبيقات الجديدة وتحديثات التطبيقات Android 16 (مستوى API 36) أو أعلى لإرسالها إلى Google Play." وتختلف المتطلبات حسب نوع الجهاز، والاستثناء الكامل الوحيد هو للتطبيقات الخاصة بشكل دائم والمخصصة للتوزيع الداخلي داخل مؤسسة واحدة.

نوع الجهازالتطبيقات الجديدة والتحديثات (من 31 أغسطس 2026)تظل التطبيقات القائمة متاحة بالكامل إذا استهدفت
الهاتف، الجهاز اللوحي، Android AutoAPI 36API 35 أو أعلى
Wear OSAPI 35API 34 أو أعلى
Android Automotive OSAPI 35API 32 أو أعلى
Android TVAPI 34API 33 أو أعلى
Android XRAPI 34API 34 أو أعلى

التطبيق القائم الذي يقل عن هذه المستويات "لن يكون متاحًا إلا على الأجهزة التي تعمل بنظام Android مساوٍ لمستوى API المستهدف لتطبيقك أو أقل منه." ويواصل من ثبّتوه بالفعل استخدامه كما كان. لكن من يستخدم هاتفًا أحدث تظهر له رسالة بأن التطبيق "صُمِّم لإصدار أقدم من Android."

هل لا يزال بإمكانك الحصول على التمديد قبل 1 نوفمبر 2026؟

فقط إذا أرسل Play إلى تطبيقك تحذيرًا بشأن السياسة وكان نموذج الطلب لا يزال ظاهرًا فيه. وحتى في هذه الحالة يستمر التمديد حتى 1 نوفمبر 2026 كحد أقصى، فهو أيام إضافية قليلة لإصلاح شبه مكتمل، وليس خطة جديدة.

تقول Google إنها ترسل إلى التطبيقات المتأثرة "رابط نموذج طلب التمديد عبر الإشعارات"، وإن النموذج "متاح من خلال صفحة تفاصيل التحذير أو المشكلة في صفحة Policy status." ولا تعرض Google أي نموذج على التطبيقات الملتزمة بالفعل.

  1. افتح Play Console واختر التطبيق.
  2. ابحث في البريد الوارد (Inbox) أو الإشعارات (Notifications) عن رسالة مستوى API المستهدف. إن وجدتها فاتبع الرابط الموجود فيها.
  3. إن لم تجدها، فانتقل إلى Policy status وافتح التحذير أو المشكلة المتعلقة بمستوى API المستهدف، وابحث عن نموذج طلب التمديد في صفحة التفاصيل.
  4. املأ النموذج لكل تطبيق متأثر، فلكل تطبيق تحذيره الخاص.
  5. سواء مُنح التمديد أم لا، خطّط لرفع إصدار يستهدف API 36 قبل 1 نوفمبر 2026. فبعد هذا التاريخ تحتاج التحديثات إلى API 36.

كيف ترفع Expo وFlutter وReact Native إلى API 36؟

أنظف طريق هو الترقية إلى إصدار من إطار العمل يستهدف API 36 بالفعل: Expo SDK 54 أو React Native 0.81 أو Flutter 3.38. وإن لم تستطع الترقية بعد، فيمكنك رفع الرقم يدويًا، لكن عليك حينها التعامل بنفسك مع تغييرات سلوك Android 16.

البيئةتستهدف API 36 افتراضيًا ابتداءً منمكان الرقمالطريق اليدوي إن لم تستطع الترقية
Expo (managed / CNG)SDK 54 (React Native 0.81)يُولَّد عبر prebuild؛ ويمكن تجاوزه باستخدام expo-build-propertiestargetSdkVersion: 36 وcompileSdkVersion: 36 في إضافة expo-build-properties
React Native (bare)0.81android/build.gradleاضبط compileSdk وtargetSdk على 36، ثم عطّل الرجوع التنبؤي (predictive back) في ملف manifest
Flutter3.38 (flutter.targetSdkVersion = 36)android/app/build.gradle(.kts)استبدل القيمة الثابتة 35 بـ 36 أو بـ flutter.targetSdkVersion

Expo. يذكر سجل تغييرات SDK 54 أن SDK 54 وReact Native 0.81 "يستهدفان الآن Android 16." قم بالترقية عبر npx expo install expo@^54.0.0 --fix، ثم شغّل npx expo-doctor@latest، وإن كنت تستخدم التوليد الأصلي المستمر (Continuous Native Generation) فـ"احذف مجلدَي android وios إن كنت قد ولّدتهما لإصدار SDK سابق." على SDK 53 يمكنك تجربة ضبط targetSdkVersion: 36 عبر إضافة expo-build-properties، لكن React Native 0.79 لا يزال يعالج الرجوع عبر onBackPressed، لذا اقرأ القسم التالي قبل النشر.

Flutter. تذكر ملاحظات إصدار Flutter 3.38 أن القيم الافتراضية هي flutter.compileSdkVersion (API 36) وflutter.targetSdkVersion (API 36)، و"تشجعك بشدة على استخدام متغيرات مستوى API التي توفرها Flutter SDK في ملفات البناء." ويتطلب الإصدار 3.38 أيضًا Java 17 كحد أدنى. وإذا كانت القيمة targetSdk = 35 مكتوبة بشكل ثابت في وحدة التطبيق، فلن تغيّرها ترقية Flutter، لذا تحقق من الملف.

React Native (bare). اضبط compileSdkVersion وtargetSdkVersion على 36 في android/build.gradle. على الإصدار 0.81 وما بعده تكون قد انتهيت تقريبًا. أما في الإصدارات الأقدم فأضف أيضًا android:enableOnBackInvokedCallback="false" إلى <application> في AndroidManifest.xml. ومن دونه يتجاوز زر الرجوع الفعلي وإيماءة الرجوع التنقلَ المكتوب بـ JavaScript.

ما الذي يتعطل عندما يبدأ التطبيق في استهداف Android 16؟

التنقل للخلف وتخطيطات الشاشات الكبيرة هما الأكثر تعطلًا. فعند استهداف API 36 يتوقف Android عن استدعاء onBackPressed، ولا يسمح لك بإلغاء وضع العرض من الحافة إلى الحافة (edge-to-edge)، ويتجاهل أقفال الاتجاه وتغيير الحجم على الشاشات التي يبلغ عرضها 600dp على الأقل.

أهم التغييرات بالنسبة للتطبيقات متعددة المنصات، من صفحة تغييرات السلوك في Android 16 من Google:

  • الرجوع التنبؤي (Predictive back): "لا يتم استدعاء onBackPressed ولم يعد يتم إرسال KeyEvent.KEYCODE_BACK." ويُعد ضبط android:enableOnBackInvokedCallback="false" وسيلة تعطيل مؤقتة.
  • العرض من الحافة إلى الحافة: أصبح windowOptOutEdgeToEdgeEnforcement "مهملًا ومعطّلًا"، لذا قد ينتهي الأمر بترويسة أو زر سفلي تحت شريط الحالة أو شريط الإيماءات.
  • الشاشات الكبيرة: على الشاشات التي يبلغ عرضها 600dp أو أكثر، يتم تجاهل screenOrientation وresizableActivity وقيود نسبة العرض إلى الارتفاع، ما قد يمطّ التخطيطات المصممة للوضع العمودي فقط. والألعاب مستثناة. ويُعد PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY وسيلة تعطيل مؤقتة "لن تنطبق عند استهداف مستوى API 37."
  • النصوص: يتم تجاهل elegantTextHeight، ما قد يغيّر ارتفاع الأسطر في العربية والتايلاندية والتاميلية وعدة أنظمة كتابة أخرى.
  • مستشعرات الصحة: استُبدل BODY_SENSORS بأذونات صحية دقيقة مثل READ_HEART_RATE.

ما المشكلات التي واجهها مطورون آخرون عند الانتقال إلى API 36؟

تُظهر التقارير العلنية حتى الآن نوعين من المشكلات: سلوك زر الرجوع الذي يتغير دون أي خطأ، ومكتبات تجعل المستوى المستهدف في الحزمة التي يستلمها Play مختلفًا عمّا تقوله ملفات المشروع.

Audius (React Native 0.79). في طلب الدمج #14635 يذكر فريق Audius أن Google Play رفض عمليتَي رفع إصدار Android رقم 1.5.186 مع الرسالة Target SDK of artifact is too low. فنقلوا compileSdk وtargetSdk من 35 إلى 36، وضبطوا أدوات البناء على 36.0.0، وأضافوا android.suppressUnsupportedCompileSdk=36، لأن "RN 0.79 يثبّت AGP 8.8". كما ضبطوا enableOnBackInvokedCallback="false"، لأن الرجوع من دونه "سيتجاوز React Navigation." ثم أزال طلب دمج لاحق هذا التعطيل بعد انتقالهم إلى React Native 0.81، الذي يسجّل OnBackPressedCallback من تلقاء نفسه.

تطبيق Flutter 3.35.2. في مشكلة Flutter رقم #174516 ضبط أحد المطورين targetSdk على 36 في Gradle وفي ملف manifest، لكن Play Console ظل يُبلغ: "Your bundle targets SDK 34, but uses a Play Core library that cannot be used with that version." وأدت إزالة المكتبة القديمة com.google.android.play:core:1.10.3 إلى أخطاء R8 من نوع "Missing classes". وأدى إصلاحها إلى الرسالة "You can't rollout this release because it doesn't allow any existing users to upgrade to the newly added app bundles." وقُبلت الحزمة أخيرًا بعد إضافة قواعد ProGuard للإبقاء على الفئات، وضبط minSdk صراحةً، وإيقاف تقسيم الحزمة حسب اللغة والكثافة وABI، على حساب حجم تنزيل أكبر.

الدرس المشترك: تغيير الرقم في Gradle لا يُنهي المهمة. فقد اضطر فريق Audius إلى إصلاح سلوك وقت التشغيل، واضطر مطور Flutter إلى إصلاح اعتمادية غيّرت ما قرأه Play من الحزمة. تحقق من الملف المبني نفسه واختبر على جهاز يعمل بـ Android 16، لا ملف الإعدادات فقط.

كيف تتحقق من إصدار API 36 قبل رفعه؟

اقرأ المستوى المستهدف من حزمة الإصدار نفسها، ثم ضع الحزمة على مسار اختبار داخلي أو مغلق، وجرّب التنقل للخلف والهوامش الداخلية (insets) وتخطيط الجهاز اللوحي على Android 16. فالرفض أو خطأ في بيئة الإنتاج يكلّف وقتًا أكثر بكثير من هذه الفحوصات.

مثال عملي: تطبيق على Expo SDK 53 يستهدف API 35 ويحتاج إلى تحديث آخر.

  1. شغّل npx expo install expo@^54.0.0 --fix، ثم npx expo-doctor@latest، وأصلح كل ما يُبلغ عنه.
  2. إذا كان المشروع يستخدم التوليد الأصلي المستمر (Continuous Native Generation)، فاحذف مجلدَي android وios القديمين وأعد البناء. وإلا فطبّق تغييرات الترقية الأصلية يدويًا.
  3. ابنِ ملف AAB للإصدار، مثلًا باستخدام eas build -p android --profile production.
  4. تأكد من المستوى المستهدف باستخدام bundletool dump manifest --bundle app.aab --xpath /manifest/uses-sdk/@android:targetSdkVersion. يجب أن يطبع 36.
  5. ارفعه إلى الاختبار الداخلي. على هاتف يعمل بـ Android 16، اضغط زر الرجوع في كل شاشة متداخلة، وتحقق من أن الترويسات والأزرار السفلية غير مخفية تحت أشرطة النظام، وقم بتدوير جهاز لوحي أو محاكٍ قابل لتغيير الحجم.
  6. رقِّ الإصدار إلى الإنتاج مع ملاحظات إصدار تذكر إصلاحات Android 16.

لتسريع الاختبار، استخدم إعداد المختبِرين في دليلنا للاختبار المغلق على Google Play، واستعر صياغة نص التحديث من أمثلة ملاحظات الإصدار لدينا. وإذا كنت تفضّل تسليم الإصدار لغيرك، فإن خدمة إرسال التطبيقات إلى المتاجر لدينا تغطي Play Console وApp Store Connect مقابل $599 للمتجرين معًا. ورسوم حسابات المطورين منفصلة.

الأسئلة الشائعة

ماذا يحدث إذا فاتني تمديد مستوى API المستهدف في 1 نوفمبر 2026؟

تبقى صفحة تطبيقك الحالية منشورة. ويظل تطبيق الهاتف الذي يستهدف API 35 أو أعلى متاحًا للمستخدمين الحاليين والجدد. لكن Play Console سيرفض أي إصدار جديد، بما في ذلك إصلاحات الأعطال العاجلة، حتى تستهدف الحزمة Android 16 (API 36). أما التطبيقات التي تستهدف أقل من API 35 فلا يمكن تثبيتها إلا على الأجهزة التي تعمل بإصدار Android ذاك أو أقدم.

هل تحتاج تطبيقات Wear OS وAndroid TV إلى استهداف API 36؟

لا. اعتبارًا من أكتوبر 2026، يجب أن تستهدف التطبيقات الجديدة والتحديثات على Wear OS وAndroid Automotive OS مستوى API 35، ويجب أن تستهدف تطبيقات Android TV وAndroid XR مستوى API 34. فقط تطبيقات الهاتف والجهاز اللوحي وAndroid Auto تحتاج إلى API 36. والاستثناء الكامل الوحيد هو التطبيق الخاص بشكل دائم والموزّع داخل مؤسسة واحدة.

هل يمكنني استهداف API 36 دون ترقية Expo SDK؟

على SDK 53 يمكنك ضبط targetSdkVersion وcompileSdkVersion على 36 في إضافة expo-build-properties، وقد فعل ذلك بعض المطورين. لكن React Native 0.79، الذي يستخدمه SDK 53، لا يزال يمرّر ضغطات الرجوع عبر onBackPressed، ولم يعد Android 16 يستدعيها عند استهداف API 36. ستحتاج إلى التعطيل بضبط enableOnBackInvokedCallback على false. والترقية إلى SDK 54 هي الطريق المدعوم.

ما الفرق بين compileSdkVersion وtargetSdkVersion؟

compileSdkVersion هو إصدار Android API الذي يُترجَم الكود مقابله. أما targetSdkVersion فيخبر Android بسلوك أي إصدار اعتمده تطبيقك، وهو ما يفرضه Google Play. ويجب أن تكون قيمة compileSdk مساوية لـ targetSdk أو أعلى منها، لذا فإن الانتقال إلى استهداف 36 يعني الترجمة مقابل API 36 أو أحدث. فمثلًا يترجم Expo SDK 58 مقابل 37 ويستهدف 36.

لماذا لا يزال Play Console يقول إن تطبيقي يستهدف مستوى API أقدم بعد أن غيّرت build.gradle؟

يقرأ Play المستوى المستهدف من الحزمة التي ترفعها، لا من ملفات المصدر. فقد تغيّر قيمةٌ ثابتة في وحدة أخرى، أو إضافةٌ قديمة، أو مكتبةٌ مثل Play Core القديمة ملفَ manifest المدمج. شغّل bundletool dump manifest على ملف AAB للإصدار لترى قيمة targetSdkVersion الفعلية، وتأكد من أنك رفعت الإصدار الجديد لا ملفًا قديمًا.

المصادر وقراءات إضافية

السياسات تتغير. راجع الوثائق الرسمية قبل النشر.

أحضر النسخة الجاهزة. أو الفكرة.

لنوصل تطبيقك إلى خط النهاية.

مكالمة مركّزة لتحديد ما يفصل تطبيقك عن صفحة منشورة في المتجر.

احجز مكالمة ↗