التفاعل يبدو ضعيفًا ← رفض
النشاط يُسجَّل ← اجتياز
جواب سريع
إذا استمر تطبيق TWA في الفشل في الاختبار المغلق (closed testing) برسالة "testers were not engaged"، فالإصلاح الأكثر موثوقية في تجربتنا هو إعادة بنائه كتطبيق WebView قياسي (WebView في Android Studio، أو Capacitor، أو Cordova) ورفع ذلك الإصدار إلى الإصدار العلني، لا إصدار TWA. احتفظ بـنفس اسم الحزمة وارفعه كتحديث حتى لا يُعاد عدّاد 14 يومًا. WebView يعالج مشكلة إشارة التفاعل، لكنه لا يعفيك من مراجعة الغلاف الرقيق، فاجعله تطبيقًا حقيقيًا. وإن كان العائق الحقيقي إيجاد 12 مختبِرًا نشطًا لـ14 يومًا متواصلة، فهذا ما تتولاه PrimeTestLab (برايم تست لاب)، من $19.99، ويبدأ الاختبار عادة خلال 4-6 ساعات.
هذا من أكثر أنواع الرفض إحباطًا لمطوّر مستقل. كان مختبروك نشطين فعلًا. كان لديك 12 أشخاص. مرّت الـ14 يومًا. ثم عادت جوجل بـ"your testers were not engaged enough." إن بنيت تطبيقك كـTrusted Web Activity (TWA) أو PWA wrapper، فالنمط ليس وهمًا: عبر 7,400+ تطبيقًا استقبلناها، تصطدم إصدارات الأغلفة بهذا الرفض تحديدًا أكثر بكثير من الإصدارات الأصلية أو WebView. يشرح هذا الدليل السبب، ويُظهر فرق المعمارية المهم، ويمرّ على الانتقال إلى WebView دون التخلي عن أيام الاختبار التي راكمتها.
جدول المحتويات
لماذا تصطدم تطبيقات TWA برفض الاختبار المغلق؟
يعرض Trusted Web Activity موقعك عبر سطح Custom Tabs في Chrome بدل رسم الشاشات داخل تطبيقك. طريقة سريعة لتحويل موقع أو PWA إلى شيء قابل للتثبيت، وكثير من تطبيقات الإصدار العلني تعمل بها بلا مشكلة. المشكلة تظهر تحديدًا عندما يحتاج حساب مطوّر شخصي إلى اجتياز شرط الاختبار المغلق الإلزامي 14 يومًا قبل طلب الإصدار العلني.
في تجربتنا بمساعدة أكثر من 7,400+ تطبيقًا عبر تلك العملية، تصطدم إصدارات TWA وPWA-wrapper برفض "testers were not engaged" أكثر بكثير من التطبيقات الأصلية القياسية، حتى عندما كان المختبرون نشطين كل يوم. النمط ثابت بما يكفي لندفع المطوّرين بعيدًا عن TWA كلما كان التطبيق ما زال بحاجة لاجتياز اختبار 14 يومًا المغلق.
إشارات تفاعل ضعيفة
النشاط الذي تقرأه مراجعة جوجل يبدو أضعف عندما يعمل المحتوى على سطح Chrome بدل داخل عملية تطبيقك. الاستخدام الحقيقي قد يبدو استخدامًا منخفضًا.
رفض "Testers not engaged"
الرسالة الأشيع التي نراها على إصدارات TWA. وافق المختبرون على المشاركة، ثبّتوا، واستخدموا التطبيق يوميًا، ومع ذلك تعلّم مراجعة طلب الإصدار العلني التفاعل بأنه غير كافٍ.
مستخدمون نشطون منخفضون في Play Console
يبلّغ بعض المطوّرين أيضًا عن أعداد مستخدمين نشطين منخفضة بشكل غير متوقع على لوحة البيانات لإصدارات TWA، بما يتوافق مع سلوك سطح Chrome نفسه.
رفض متكرر عند إعادة الإرسال
لأن المعمارية هي الجذر، إعادة إرسال نفس إصدار TWA تميل للفشل بنفس الطريقة: لذلك نادرًا ما يصلح الترقيع، بينما يصلح إعادة البناء.
تحفّظ صريح: لا توثّق جوجل علنًا أي الإشارات توزن بالضبط في مرحلة مراجعة طلب الإصدار العلني، فاعتبر الآلية الدقيقة ملاحظتنا، لا سياسة رسمية. كن حذرًا من أي منشور منتدى يدّعي معرفة القياس عن بُعد بالضبط. ما نستطيع الإبلاغ عنه بثقة هو النتيجة التي نراها باستمرار: تُرفض إصدارات TWA بسبب التفاعل، وإصدارات WebView المماثلة تجتاز.
ما هو TWA فعليًا (وكيف يُبنى)
قبل إصلاح الرفض، يفيد فهم ما رفعته بالضبط. Trusted Web Activity تطبيق أندرويد هو في جوهره موقعك يعمل بملء الشاشة داخل محرك متصفح حقيقي: بلا شريط عنوان، بلا واجهة متصفح، ولا شيء يخبر المستخدم أنه ينظر إلى صفحة ويب. للمستخدم يبدو كتطبيق أصلي. تحت الغطاء، هو موقعك الحي.
تُولَّد TWAs عادة عبر CLI Bubblewrap من جوجل أو PWABuilder، وكلاهما يعتمد على مكتبة androidbrowserhelper. توجّه الأداة إلى URL، تنتج مشروع أندرويد، توقّعه وترفع AAB إلى جوجل بلاي.
لماذا يلجأ المطوّرون إلى TWA
قاعدة شفرة واحدة
لديك موقع أصلًا (ويفضّل PWA). يوصله TWA إلى متجر Play دون إعادة كتابة بـ Kotlin أو Flutter أو React Native.
تحديثات فورية
لأن التطبيق يحمّل موقعك الحي، تنشر التغييرات بنشر موقعك: بلا تحديث تطبيق، بلا طابور مراجعة.
رخيص وسريع
توليد TWA يستغرق دقائق لا أسابيع. لـ PWA موجود هو أقل مسار جهدًا نحو أندرويد.
المقايضة التي تسبب الرفض
نفس ما يجعل TWA رخيصًا يجعله هشًا للاختبار المغلق:
- يحتاج الإنترنت. هو نافذة على موقعك، فاتصال ضعيف يعني تطبيقًا ضعيفًا ما لم يكن لـ PWA دعم offline متين.
- مخاطر رفض متجر Play. سياسة Minimum Functionality / المحتوى المعاد تغليفه تستهدف التطبيقات التي «مجرد موقع في غلاف». TWA بلا قدرة أصلية حقيقية قد يُرفض أو يُزال، خاصة في الإرسالات الجديدة. إضافة ميزات أصلية (إشعارات push، وضع offline، كاميرا، أهداف مشاركة) هو ما يبقيك على الجانب الصحيح من ذلك الخط.
- مشكلة إشارة التفاعل أعلاه، ولهذا تستمر الحسابات الشخصية أمام اختبار 14 يومًا المغلق في رؤية رسالة "testers not engaged".
سوء الفهم: TWA ليس WebView
هذا ما تخطئ فيه معظم المقالات، ويستحق الدقة لأنه يغيّر طريقة الإصلاح. TWA لا يستخدم مكوّن WebView في أندرويد أصلًا.
«TWA مجرد غلاف WebView»
WebView في أندرويد متصفح مضمّن مخفّف يتحكم فيه التطبيق: أقدم، بميزات أقل وعزل أمني أضعف. TWA لا يستخدمه.
TWA يستخدم محرك Custom Tabs
يسلّم URL إلى المتصفح الكامل المثبّت لدى المستخدم (عادة Chrome) ويطلب منه عرض الصفحة بملء الشاشة بلا واجهة: محرك المتصفح الحقيقي، لا مكوّنًا مضمّنًا.
لأن TWA يستخدم المحرك خلف Custom Tabs، تحصل على نفس محرك العرض ومحرك JavaScript وصندوق الأمان مثل Chrome الحقيقي، بالإضافة إلى ملفات تعريف الارتباط والتخزين المشتركة مع Chrome (فيبقى المستخدم المسجّل على الويب مسجّلًا)، وتحديثات المتصفح التلقائية، ودعم كامل لمنصة الويب. هذا قوي فعلًا لتطبيق منشور عادي، لكنه يعني أيضًا أن شاشاتك تعمل خارج العملية، داخل Chrome، لا داخل تطبيقك. هنا جذر تخفيف إشارة التفاعل وانخفاض عدّ المستخدمين النشطين.
تدفق الإطلاق خطوة بخطوة
أندرويد يشغّل LauncherActivity الخاصة بـ TWA (من androidbrowserhelper).
تفتح الصفحة في Custom Tab بملء الشاشة بلا واجهة Chrome: بلا شريط عنوان، بلا تبويبات، بلا واجهة متصفح.
هذا هو «Trusted» في Trusted Web Activity. إن لم يستطع التطبيق إثبات ملكية الموقع، يبقى شريط العنوان ظاهرًا وتنكسر وهم الأصالة.
فحص الثقة: Digital Asset Links
لا يزيل Chrome شريط العنوان إلا إذا أثبت التطبيق ملكية الموقع عبر Digital Asset Links. يصرّح التطبيق بالموقع الذي يمثله، ويجب أن يخدم الموقع ملفًا عند /.well-known/assetlinks.json يسمّي حزمة التطبيق وبصمة شهادة التوقيع (SHA-256).
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.yourapp.name",
"sha256_cert_fingerprints": [
"AB:CD:EF:...:99" // your signing cert SHA-256
]
}
}]
التطبيق يصرّح بالموقع
الـ manifest يسمّي نطاق https الذي يمثله التطبيق.
الموقع يخدم assetlinks.json
الملف يسرد اسم الحزمة وبصمة SHA-256.
Chrome يطابق الطرفين
يجب أن تطابق البصمة شهادة توقيع التطبيق.
إن أبلغ المختبرون عن شريط عنوان متصفح في أعلى «تطبيقك»، فملف assetlinks.json مفقود، أو يعيد 404، أو يحمل بصمة SHA-256 خاطئة. أصلح الملف (وتأكد أن البصمة تطابق المفتاح الذي يوقّع به جوجل بلاي فعليًا تحت Play App Signing)، لكن تذكّر: هذا يعيد وهم ملء الشاشة فقط. لا يصلح رفض إشارة التفاعل، الذي يحتاج إعادة بناء WebView.
مسار إشارة التفاعل: TWA مقابل WebView
أبسط طريقة لفهم الرفض هي تتبّع أين يذهب نشاط المختبر فعليًا. في TWA، تعيش شاشاتك طبقة واحدة أبعد عن تطبيقك، داخل سطح Custom Tabs في Chrome. في تطبيق WebView، تعمل الشاشات نفسها داخل عملية تطبيقك، وتُنسب مباشرة إلى حزمتك. ذلك الفرق الواحد يغيّر قوة تسجيل النشاط.
أين يُنسب نشاط المختبر
WebView يحمّل URL موقعك داخل تطبيقك، فيُسجَّل النشاط ضد حزمتك كما تتوقع مراجعة جوجل. مع TWA، Custom Tab في الوسط هو القفزة الإضافية التي تبدو وكأنها تخفّف الإشارة. لهذا أيضًا لا تعني الأرقام المنخفضة في تحليلات الويب الخاصة بك (Google Analytics، Firebase في طبقة الويب) على TWA بالضرورة أن «جوجل ترى صفر استخدام»، لكن النتيجة العملية للاختبار المغلق واحدة: إعادة البناء إلى WebView هو الإصلاح المعتمد.
كيف تتعرّف على TWA (من الخارج والداخل)
لست متأكدًا إن كان التطبيق الذي (أو المقاول) رفعته TWA فعلًا؟ إليك كيف تتأكد: بالعين أولًا، ثم بشكل قاطع من APK أو جهاز متصل.
علامات بصرية سريعة (كمستخدم)
- يتصرف تمامًا كالموقع، لأنه هو الموقع.
- إن أخطأ المطوّر في الإعداد، سترى شريط عنوان متصفح في الأعلى: دليل قاطع (انظر خطأ assetlinks أعلاه).
- يتحدّث المحتوى دون تحديث تطبيق يظهر في متجر Play.
علامات تقنية قاطعة (فحص APK / الجهاز)
| العلامة | ماذا تعني |
|---|---|
DelegationService يصرّح بإجراء TRUSTED_WEB_ACTIVITY_SERVICE |
البصمة الأكثر موثوقية: فقط TWAs تصرّح بهذا. |
LauncherActivity (غالبًا ManageDataLauncherActivity) من com.google.androidbrowserhelper |
مشغّل Bubblewrap. |
| نطاق https موثَّق في إعدادات روابط التطبيق (assetlinks.json يعمل) | الموقع الذي يغلفه TWA. |
لا libflutter.so، لا index.android.bundle، قليل من الشيفرة الأصلية |
غلاف ويب، لا بناء Flutter / React Native / أصلي. |
أكّدها بـ adb
على جهاز متصل (أو محاكي)، أمران يحسمان الأمر:
# Is it a TWA? Look for the delegation service: adb shell dumpsys package <package.name> | grep -i DelegationService # Which site does it wrap, and is the trust check passing? adb shell pm get-app-links <package.name> # -> "verified" = Digital Asset Links pass (fullscreen) # -> "1024" = verification failed (address bar shows)
قراءة النتيجة: إن رأيت DelegationService وLauncherActivity من androidbrowserhelper، فأنت على الأرجح أمام TWA. إن رأيت بدلًا من ذلك MainActivity مخصصًا ومكتبات .so أصلية بلا خدمة تفويض، فهو تطبيق أصلي حقيقي (أو Flutter / React Native)، ومشكلة إشارة التفاعل في هذا الدليل لا تنطبق عليه.
TWA مقابل WebView للاختبار المغلق: جنبًا إلى جنب
كلتا المعماريّتين تغلف محتوى ويب. الفرق المهم لاجتياز اختبار 14 يومًا المغلق هو أين يعمل ذلك المحتوى وكيف يُنسب نشاطه. إليك المقارنة على المقاييس التي تقرّر وصولك إلى الإصدار العلني في دورة واحدة.
TWA / PWA Wrapper
الأنسب: تطبيقات موافَق عليها أصلًا ولا تحتاج اجتياز الاختبار المغلق.
WebView قياسي
الأنسب: تطبيقات يجب أن تجتاز اختبار 12 مختبِرًا و14 يومًا المغلق.
فحص توافق الإطار
WebView يتصرف بشكل مختلف عن Chrome على سطح المكتب. اختر حزمتك لترى الإعداد الذي يكسر الإطلاق غالبًا.
فعّل DOM Storage
SPA / توجيه العميلتطبيقات الصفحة الواحدة تعتمد على localStorage وsessionStorage للتوجيه من جانب العميل وحالة المصادقة. إن لم تفعّل settings.domStorageEnabled = true، سينكسر التوجيه عند الإطلاق: يصل المختبرون إلى شاشة فارغة أو محمّل عالق، فيُقرأ ذلك كـ «غير متفاعل».
أبْقِ أيضًا javaScriptEnabled = true وتعامل مع التنقل داخل التطبيق بـ WebViewClient حتى لا تقفز الروابط العميقة إلى Chrome.
صرّح بأذونات أصلية للتضمين والرفع
منشئ No-CodeWebView يتعامل مع تضمينات iframe بشكل مختلف عن Chrome سطح المكتب، ومنشئو no-code يعتمدون عليها بكثافة. تأكد أن أذونات رفع الملفات مُصرَّح بها أصليًا في AndroidManifest.xml (واربط WebChromeClient.onShowFileChooser)، وإلا تفشل النماذج ورفع الوسائط بصمت.
أضف <uses-permission android:name="android.permission.INTERNET"/>، وإن قبلت وسائط فأذونات الكاميرا/التخزين، ثم اطلبها وقت التشغيل.
أضف تخزينًا مؤقتًا offline وقيمة أصلية حقيقية
ثابت / CMSموقع ثابت عادي محمّل في WebView هو المثال الدراسي لـ «الغلاف الرقيق». اضبط cacheMode = LOAD_DEFAULT كاحتياطي offline صالح، أضف شاشة خطأ/إعادة محاولة بعلامتك عند انقطاع الاتصال، وطبّق ميزة أصلية واحدة على الأقل (إشعارات push، هدف مشاركة، أو اختصارات الشاشة الرئيسية).
هذا ما ينقل CMS أو تصديرًا ثابتًا من «موقع مؤطّر» إلى تطبيق يجتاز مراجعة Minimum Functionality.
الإصلاح: ابنِ تطبيق WebView قياسيًا بدلًا منه
بدل ترقيع TWA أو محاولة انتزاع إشارات أفضل منه، المسار الأنظف هو إعادة بناء التطبيق حول مكوّن WebView ونشر ذلك الإصدار. لديك ثلاث طرق شائعة، كلها تحمّل موقعك داخل تطبيقك:
المسار الأكثر مباشرة. ضع WebView في النشاط الرئيسي، وجّهه إلى URL، وفعّل JavaScript وتخزين DOM. أقصى تحكم بلا إطار إضافي.
إن كان تطبيقك مشروع ويب/PWA أصلًا، يغلفه Capacitor في غلاف WebView أصلي ويمنحك إضافات أصلية (كاميرا، push، تخزين). مسار ترقية نظيف من PWA دون مشكلة إشارة TWA.
الخيار الأقدم وما زال صالحًا. نفس الفكرة الأساسية: محتوى الويب يعمل داخل WebView التطبيق لا على سطح Custom Tabs في Chrome.
الحد الأدنى لإعداد WebView (جاهز للنسخ)
الأساس صغير: WebView يحمّل URL مع تفعيل JavaScript والتخزين، يبقي التنقل داخل التطبيق بدل القفز إلى Chrome، ويربط معالج زر الرجوع الذي تتوقعه مراجعة جوجل. بدّل التبويب للغتك وانسخ الأساس:
val webView = findViewById<WebView>(R.id.webview)
webView.settings.apply {
javaScriptEnabled = true // most sites need this
domStorageEnabled = true // localStorage / sessionStorage
cacheMode = WebSettings.LOAD_DEFAULT
}
// Keep links INSIDE the app (this is the key difference vs a TWA)
webView.webViewClient = WebViewClient()
webView.loadUrl("https://yourwebsite.com")
// The exact back-button handler Google looks for
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (webView.canGoBack()) {
webView.goBack()
} else {
finish()
}
}
})
WebView webView = findViewById(R.id.webview); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); // most sites need this settings.setDomStorageEnabled(true); // localStorage / sessionStorage settings.setCacheMode(WebSettings.LOAD_DEFAULT); // Keep links INSIDE the app (this is the key difference vs a TWA) webView.setWebViewClient(new WebViewClient()); webView.loadUrl("https://yourwebsite.com"); // The exact back-button handler Google looks for getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { if (webView.canGoBack()) { webView.goBack(); } else { finish(); } } });
# Wrap an existing web/PWA project in a native WebView shell npm install @capacitor/core @capacitor/cli npx cap init "YourApp" "com.yourapp.name" # Point Capacitor at your live site (capacitor.config.ts) # server: { url: "https://yourwebsite.com", cleartext: false } npm install @capacitor/android npx cap add android npx cap sync # Capacitor handles back-button + DOM storage natively. # Open in Android Studio to build a signed AAB: npx cap open android
ثلاثة أشياء يجب إضافتها لاجتياز المراجعة
WebView عارٍ يستدعي فقط loadUrl() ما زال غلافًا رقيقًا. هذه الإضافات الثلاث تجعله تطبيقًا حقيقيًا وتبعد المختبرين عن الشاشات الفارغة:
اربط OnBackPressedCallback (كما في المقتطف أعلاه) بحيث يمشي الرجوع في سجل الويب أولًا، ولا يخرج من التطبيق إلا عندما لا يبقى مكان للعودة. بدونه، ضغطة واحدة تغلق التطبيق بالكامل وتبدو مكسورة: علم أحمر فوري للغلاف الرقيق.
نفّذ onReceivedError في WebViewClient لعرض شاشة «أنت غير متصل» حقيقية مع زر إعادة محاولة بدل صفحة بيضاء. شاشة فارغة عند انقطاع الاتصال أسرع طريق لتبدو كغلاف رقيق وتفشل المراجعة.
إشعارات push (FCM)، تخزين offline، هدف مشاركة، رفع ملفات عبر WebChromeClient.onShowFileChooser، أو تكامل جهاز. أي شيء يجعل التطبيق أكثر من URL الذي يحمّله. هذا ما يجتاز سياسة Minimum Functionality.
إن لم ترد كتابة شيفرة أندرويد يدويًا، Capacitor يغلف مشروع الويب الموجود في غلاف WebView أصلي ويشحن معالجة زر الرجوع وشاشة بداية أصلية ونظام إضافات (push، كاميرا، نظام ملفات) جاهزًا. هو أكثر مسار PWA-إلى-WebView مباشرة يتجنب سلوك Custom Tabs في TWA بالكامل: تحصل على نسب WebView داخل العملية و ميزات أصلية سهلة في خطوة واحدة.
انشر التطبيق الذي اختبرته. ابنِ تطبيق WebView، مرّره عبر الاختبار المغلق، وانشر نفس الإصدار إلى الإصدار العلني. لا تختبر معمارية وتبدّل تطبيقًا مختلفًا بعدها: إرسال إصدار لاجتياز المراجعة ثم استبداله في الإصدار العلني يصطدم بسياسات السلوك المضلل لدى جوجل وقد يعلّق تطبيقًا أو حسابًا. الانتقال الدائم إلى WebView يتجاوز ذلك تمامًا، لأن ما تختبره هو ما تطلقه.
كيف تنتقل دون إعادة عدّاد 14 يومًا
إن كنت في منتصف الاختبار، لا يجب أن تبدأ من الصفر. ينجو عدّاد 14 يومًا من تحديث التطبيق ما دمت على نفس المسار بنفس اسم الحزمة. هذا الانتقال الآمن:
احتفظ بـ applicationId نفسه تمامًا كـ TWA الحالي. اسم حزمة مختلف ينشئ قائمة تطبيق جديدة ويجبر على دورة 14 يومًا جديدة.
versionCode بمقدار 1 على الأقل فوق إصدار TWA، وإلا سيرفض Play Console الرفع كنسخة مكررة.تحميل موثوق، معالجة صحيحة لـزر الرجوع، حالات offline وأخطاء معقولة، بلا شاشات فارغة. هذا أيضًا ما يبقيك بعيدًا عن مراجعة الغلاف الرقيق (القسم التالي).
افتح مسار الاختبار المغلق، أنشئ إصدارًا جديدًا، وارفع AAB الخاص بـ WebView. لا تنشئ مسارًا جديدًا ولا تطبيقًا جديدًا.
يحدّث المختبرون الذين وافقوا على المشاركة إلى إصدار WebView ويكملون. يستمر العدّاد ما دام 12 مختبِرًا على الأقل نشطين.
رفع تحديث إلى مسار الاختبار المغلق لا يعيد عدّاد 14 يومًا. يستمر العدّاد، وتعتبر جوجل التكرار النشط أثناء الاختبار جزءًا طبيعيًا من العملية. هذا ما يجعل تبديل TWA إلى WebView في منتصف الدورة ممكنًا دون فقدان الأيام التي راكمتها.
هل يُعد تطبيق WebView ما زال «غلافًا رقيقًا»؟
هذا الفخ يمسك المطوّرين الذين يظنون WebView رصاصة سحرية. الانتقال من TWA إلى WebView يعالج مشكلة إشارة التفاعل، لكنه لا يعفيك من سياسة جوجل Spam and Minimum Functionality. WebView ليس سوى صفحتك الرئيسية في إطار قد يُرفض كغلاف رقيق، بنفس طريقة TWA العاري.
يفيد أن ترى هذين كـبوابتين منفصلتين. خدمة اختبار أو إعادة بناء WebView قد تساعدك على اجتياز إحداهما، لا الأخرى.
شرط الاختبار المغلق
فحص عدد ومدة: 12 مختبِرًا على الأقل وافقوا على المشاركة، نشطين 14 يومًا متواصلة. WebView يجعل قراءة التفاعل موثوقة؛ PrimeTestLab يوفّر المختبرين.
عدد + مدةMinimum Functionality (غلاف رقيق)
قرار سياسة وجودة: هل يقدّم التطبيق قيمة حقيقية، أم مجرد موقع مؤطّر؟ فقط تطبيق جوهري يجتازها: لا خدمة ولا تبديل معماري يفعل ذلك عنك.
سياسة + جودةإذن الهدف ليس فقط «WebView بدل TWA»، بل تطبيق WebView بقيمة أصلية وسلوك كافٍ ليصمد وحده. عمليًا يعني ذلك:
يجب أن يتنقل الرجوع في سجل الويب ثم يخرج بسلاسة: لا يسقط المختبر على شاشة فارغة ولا يقتل التطبيق فجأة.
اعرض شاشة «أنت غير متصل» حقيقية ومسار إعادة محاولة. شاشة بيضاء عند انقطاع الاتصال أسرع طريق لتبدو كغلاف رقيق.
إشعارات push، تجربة الشاشة الرئيسية، تكامل جهاز، تخزين offline: أي شيء يجعل التطبيق أكثر من URL الذي يحمّله.
قاعدة الطعم والتبديل (لا تكسرها)
لا تختبر تطبيقًا جوهريًا ثم تبدّل في الإصدار العلني تطبيقًا مختلفًا جوهريًا (أو أرق). هذا بالضبط السلوك المضلل الذي تعلق جوجل الحسابات بسببه.
افعل: اختر معمارية WebView، ابنِها جوهريًا، اختبر ذلك الإصدار، وانشر نفس الإصدار بالضبط. التزم به عبر الاختبار والإصدار العلني.
تريد قائمة أعمق لما يثير رفض الجودة؟ دليلنا عن لماذا يُرفض الاختبار المغلق يفصّل أشهر إخفاقات السياسة والمراجعة خارج التفاعل.
لست متأكدًا إن كان تطبيقك TWA؟ نتحقق لحظة طلبك
لا يجب أن تشغّل أوامر adb أو تحفر في APK بنفسك. نعم: تستطيع PrimeTestLab تأكيد ما إذا كان تطبيقك TWA نيابة عنك. لحظة طلب خدمة الاختبار، يفحص فريقنا إصدارك، يحدّد إن كان TWA أو PWA wrapper، وإن كان كذلك نخبرك بالضبط بما تصلح قبل إهدار عدّاد 14 يومًا على معمارية ستُعلَّم بسبب التفاعل.
فحصنا ونصحنا بشأن أكثر من 200 تطبيق TWA في الأشهر القليلة الماضية وحدها، وبعد توصياتنا والإصلاحات اجتازت تلك التطبيقات بنجاح في مسارها. عندما نرصد TWA، تحصل على خطة إعادة بناء واضحة قابلة للتنفيذ، لا «حاول مجددًا» غامضة.
ماذا يحدث لحظة الطلب
بمجرد مشاركة مسار الاختبار المغلق أو الإصدار معنا، يدخل تطبيقك طابور المراجعة: بلا طلب إضافي.
يفحص فريقنا بصمات TWA المعروفة: DelegationService، مشغّل androidbrowserhelper، سلوك Custom Tabs، وغياب الشيفرة الأصلية (نفس العلامات في قسم الكشف أعلاه).
تحصل على توصية محددة، عادة إعادة بناء WebView في هذا الدليل، حتى تصلح المعمارية قبل حرق دورة 14 يومًا على إصدار سيفشل مراجعة التفاعل.
بالمعمارية الصحيحة و12+ مختبِرًا معتمدين نشطين 14 يومًا بلا انقطاع، تُغطى البوابتان: وهكذا نحافظ على نسبة نجاح 99.9%.
معظم المطوّرين يعلمون أن TWA هو المشكلة بعد دورة 14 يومًا فاشلة: أي البدء من جديد. لأننا نلتقطه في اليوم صفر، تصلح المعمارية مرة، تختبر مرة، وتنشر مرة. ذلك الفرق بين مسار أنظف في أسبوعين وشهر من الرفض المتكرر.
كيف تساعد PrimeTestLab (النصف الآخر من المشكلة)
المعمارية نصف المشكلة. النصف الآخر، الذي يوقف معظم المطوّرين المنفردين، هو إيجاد 12 مختبِرًا يوافقون على المشاركة ويبقون موافقين 14 يومًا بلا انقطاع. هذا ما تتولاه PrimeTestLab.
نوفّر مختبرين موثّقين وافقوا على المشاركة على أجهزة أندرويد حقيقية يبقون اختبارك المغلق نشطًا طوال الشرط، حتى لا يكسر انسحاب مختبر واحد سلسلة 14 يومًا. تشارك رابط الانضمام للاختبار المغلق؛ نتولى الدعوة، التحقق من الموافقة، مراقبة التفاعل اليومي، والاحتفاظ 14 يومًا. 7,400+ تطبيقًا وأكثر، بنسبة نجاح 99.9% من المحاولة الأولى.
خدمة الاختبار تغطي شرط المختبرين. لا تختار معمارية تطبيقك ولا تجتاز مراجعة الغلاف الرقيق عنك. التركيبة الرابحة هي إصدار WebView جوهري مع 12 مختبِرًا حقيقيًا لـ14 يومًا كاملة، حتى لا يكون أي طرف سبب الرفض.
الباقات الحالية
- يحقق الحد الأدنى لدى جوجل
- أجهزة أندرويد حقيقية
- تغطية 14 يومًا كاملة
- أقصى هامش أمان
- أفضل تنوع أجهزة
- أقوى نسبة من المحاولة الأولى
الأسئلة الشائعة
لماذا يستمر رفض تطبيق TWA في الاختبار المغلق؟
في تجربتنا عبر 7,400+ تطبيقًا، تصطدم إصدارات TWA وPWA wrapper برفض "testers were not engaged" أكثر بكثير من التطبيقات الأصلية القياسية، حتى عندما كان المختبرون نشطين يوميًا. السبب المحتمل أن إشارات التفاعل التي تقرأها مراجعة طلب الإصدار العلني تصل أضعف عندما يعمل محتوى الويب عبر سطح Custom Tabs في Chrome بدل داخل عملية تطبيقك. لا توثّق جوجل الإشارات الدقيقة علنًا، فاعتبر هذا ملاحظتنا لا سياسة رسمية.
هل أنتقل من TWA إلى WebView، أم أحاول إصلاح TWA فقط؟
في تجربتنا، إعادة البناء كتطبيق WebView قياسي أكثر موثوقية بكثير من محاولة انتزاع إشارات تفاعل أفضل من TWA. WebView يحمّل موقعك داخل تطبيقك، فيُسجَّل النشاط ضد حزمتك كما تتوقع المراجعة. بعد الانتقال إلى WebView، ابقَ عليه: انشر الإصدار الذي اختبرته بدل الرجوع إلى TWA للإصدار العلني.
هل يجتاز تطبيق WebView الاختبار المغلق تلقائيًا؟
لا. الانتقال إلى WebView يزيل مشكلة إشارة التفاعل التي نراها مع TWA، لكنه لا يعفيك من سياسة Spam and Minimum Functionality. WebView يؤطّر موقعك فقط قد يُرفض كغلاف رقيق، فاجعله تطبيقًا حقيقيًا بقيمة أصلية، ومعالجة صحيحة لزر الرجوع، وحالات offline وأخطاء سليمة.
هل تحديث التطبيق أثناء الاختبار المغلق يعيد عدّاد 14 يومًا؟
لا. رفع تحديث إلى مسار الاختبار المغلق لا يعيد عدّاد 14 يومًا. يستمر العدّاد، فتستطيع تبديل إصدار TWA بإصدار WebView في منتصف الدورة دون البدء من جديد، ما دمت تحتفظ بنفس اسم الحزمة. تعتبر جوجل التكرار النشط أثناء الاختبار طبيعيًا.
لماذا يظهر TWA مستخدمين نشطين منخفضين في Play Console؟
يبلّغ بعض المطوّرين عن أعداد مستخدمين نشطين منخفضة لإصدارات TWA. لا توثّق جوجل السبب الدقيق، لكنه يبدو مرتبطًا بعمل محتوى الويب عبر سطح Custom Tabs بدل داخل تطبيقك. يميل إصدار WebView إلى الإبلاغ عن النشاط بموثوقية أكبر لأن الشاشات تعمل داخل عمليتك.
هل من الآمن اختبار TWA ونشر تطبيق WebView بدلًا منه؟
الخطوة الآمنة هي اختبار ونشر نفس الإصدار. بدل اختبار TWA وتبديل تطبيق مختلف، أعد البناء كـ WebView أولًا، مرّر إصدار WebView عبر الاختبار المغلق، وانشر ذلك الإصدار بالضبط إلى الإصدار العلني. إرسال تطبيق لاجتياز المراجعة واستبداله بآخر مختلف جوهريًا يعرّضك للتعليق تحت سياسات السلوك المضلل لدى جوجل.
هل يمكن أن يُوافَق على TWA أو PWA wrapper في جوجل بلاي؟
نعم، يمكن أن تجتاز تطبيقات الأغلفة عندما تستوفي سياسة Minimum Functionality وتكمل شرط الاختبار المغلق. لكن لحسابات شخصية يجب أن تجتاز اختبار 12 مختبِرًا و14 يومًا، نرى باستمرار أن إصدارات WebView تجتاز مراجعة التفاعل بموثوقية أعلى من TWA، ولهذا نوجّه المطوّرين إلى WebView في تلك الحالة.
هل يستخدم TWA مكوّن WebView في أندرويد؟
لا: هذا أشيع سوء فهم. TWA لا يستخدم WebView في أندرويد. يستخدم المحرك خلف Custom Tabs، مسلّمًا URL إلى المتصفح الكامل المثبّت (عادة Chrome) ليعرض بملء الشاشة بلا واجهة. فتحصل على نفس محرك العرض وJavaScript وصندوق الأمان مثل Chrome، بالإضافة إلى ملفات تعريف الارتباط والتخزين المشتركة. WebView في أندرويد، بالمقابل، متصفح مضمّن يتحكم فيه التطبيق ويعمل داخل عملية تطبيقك: ولهذا بالضبط تصلح إعادة بناء WebView نسب التفاعل.
لماذا يظهر TWA شريط عنوان متصفح في الأعلى؟
يعني ذلك فشل فحص ثقة Digital Asset Links. لا يخفي Chrome شريط العنوان إلا إذا خدم موقعك ملف /.well-known/assetlinks.json صالحًا يسمّي حزمة التطبيق وبصمة SHA-256 لشهادة التوقيع. إن كان الملف مفقودًا، أو يعيد 404، أو لا تطابق البصمة المفتاح الذي يوقّع به جوجل بلاي تحت Play App Signing، يفتح التطبيق لكن Chrome يُظهر شريط عنوانه. إصلاح assetlinks.json يعيد ملء الشاشة، لكنه لا يصلح رفض تفاعل الاختبار المغلق: ذلك يحتاج إعادة بناء WebView.
كيف أعرف إن كان التطبيق TWA؟
افحص الإصدار. العلامة الأكثر موثوقية هي DelegationService يصرّح بإجراء TRUSTED_WEB_ACTIVITY_SERVICE: فقط TWAs تفعل ذلك. ترى أيضًا عادة LauncherActivity من com.google.androidbrowserhelper بلا مكتبات Flutter أو React Native أصلية. على جهاز متصل شغّل adb shell dumpsys package <package> | grep -i DelegationService لرصد الخدمة، وadb shell pm get-app-links <package> لترى إن كان تحقق Digital Asset Links يمر ("verified") أو يفشل ("1024").
هل تستطيع PrimeTestLab إخباري إن كان تطبيقي TWA؟
نعم. لحظة طلب خدمة الاختبار، يفحص فريقنا إصدارك، يؤكد إن كان TWA أو PWA wrapper، وإن كان كذلك يرسل توصية إصلاح محددة قبل إهدار عدّاد 14 يومًا. فحصنا أكثر من 200 تطبيق TWA في الأشهر الأخيرة، وبعد توصياتنا والإصلاحات اجتازت تلك التطبيقات بنجاح في مسارها. لا تحتاج تشغيل adb أو فحص APK بنفسك.
بأي سرعة توفّر PrimeTestLab مختبرين لاختباري المغلق؟
بمجرد أن يكون مسار الاختبار المغلق حيًا وقابلًا للوصول، يبدأ مختبرو PrimeTestLab عادة الموافقة على المشاركة خلال 4-6 ساعات. تبدأ الأسعار من $19.99 لـ 12 مختبِرًا، بنسبة نجاح 99.9% عبر 7,400+ تطبيقًا.
الخلاصة
ملخص
إذا استمر إصدار TWA في الفشل في الاختبار المغلق لجوجل بلاي برفض التفاعل، فأنظف إصلاح هو إعادة بنائه كتطبيق WebView قياسي ونشر ذلك الإصدار إلى الإصدار العلني، بلا الرجوع إلى TWA بعدها. احتفظ بـنفس اسم الحزمة حتى لا يعيد التحديث عدّاد 14 يومًا، اجعل التطبيق جوهريًا بما يكفي لاجتياز مراجعة Minimum Functionality، ودع PrimeTestLab تغطي شرط 12 مختبِرًا و14 يومًا حتى لا يكون الاختبار سبب الرفض. WebView يصلح بوابة التفاعل؛ تطبيق حقيقي يجتاز بوابة الغلاف الرقيق؛ PrimeTestLab يوفّر المختبرين. اطّلع على خطط الأسعار ←