توضّح هذه الصفحة كيفية تحديد وحلّ المشاكل التي قد تواجهك أثناء تطوير ألعاب Android باستخدام "خدمات ألعاب Google Play".
التسجيل
لتحديد المشاكل وحلّها في لعبتك، يمكنك تفعيل التسجيل المفصّل على جهازك باستخدام الأمر adb shell. يمكنك بعد ذلك عرض رسائل سجلّ "خدمات ألعاب Google Play" باستخدام logcat.
تفعيل التسجيل
لتفعيل التسجيل على جهاز الاختبار، اتّبِع الخطوات التالية:
وصِّل الجهاز بجهاز كمبيوتر مثبَّت عليه حزمة تطوير البرامج (SDK) لنظام التشغيل Android.
افتح وحدة طرفية وشغِّل الأمر التالي:
adb shell setprop log.tag.Games VERBOSE
شغِّل لعبتك على الجهاز وأعِد إظهار المشكلة التي تحاول تصحيحها.
عرض السجلّات:
adb logcat
إيقاف التسجيل
لإيقاف التسجيل المطوَّل في "خدمات ألعاب Play" على جهازك والعودة إلى سلوك التسجيل الأصلي، شغِّل الأمر التالي:
adb shell setprop log.tag.Games INFO
تعذرت المصادقة
إذا لم تتمكّن من إثبات هوية اللاعبين في لعبتك، تأكَّد أولاً من اتّباع التعليمات الخاصة بإنشاء أرقام تعريف العملاء وإعداد خدمات الألعاب. إذا استمرّت مواجهة أخطاء في المصادقة، راجِع العناصر التالية للتأكّد من إعداد لعبتك بشكل صحيح.
التحقّق من علامات البيانات الوصفية
يجب أن يحتوي AndroidManifest.xml على علامة بيانات وصفية للألعاب. للتأكّد من إعداد علامات البيانات الوصفية بشكلٍ صحيح، اتّبِع الخطوات التالية:
افتح
AndroidManifest.xmlوتأكَّد من أنّه يحتوي على علامةmeta-dataكما هو موضّح أدناه:<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" />ابحث عن تعريف المورد
@string/app_id. يتم عادةً تحديدها في ملف XML موجود في الدليلres/xml، مثلres/xml/strings.xmlأوres/xml/ids.xml.تأكَّد من أنّ قيمة المورد
@string/app_idتتطابق مع رقم التعريف الرقمي لتطبيقك. يجب أن تحتوي قيمة هذا المرجع على أرقام فقط. مثلاً:<string name="app_id">123456789012</string>
التحقّق من اسم الحزمة
يجب أن يتطابق اسم حزمة لعبتك مع اسم الحزمة في معرّف العميل. لإثبات صحة اسم الحزمة، اتّبِع الخطوات التالية:
افتح
AndroidManifest.xmlوتأكَّد من صحة اسم حزمة لعبتك. اسم الحزمة هو قيمة السمةpackageفي العلامةmanifest.تأكَّد من اسم الحزمة الذي قدّمته عند إنشاء رقم تعريف العميل. لتأكيد اسم الحزمة في Google Play Console، انتقِل إلى Play Console وانقر على الإدخال الذي يتوافق مع لعبتك.
انتقِل إلى علامة التبويب التطبيقات المرتبطة واطّلِع على قائمة معرّفات العملاء. يجب أن يتضمّن هذا التطبيق تطبيقًا مرتبطًا على Android يتطابق اسم الحزمة فيه مع اسم الحزمة في
AndroidManifest.xml. في حال عدم التطابق، أنشئ معرّف عميل جديدًا باسم الحزمة الصحيح وحاوِل المصادقة مرة أخرى.
التحقّق من الملف المرجعي للشهادة
يجب أن تتطابق الشهادة التي يتم من خلالها المصادقة على لعبتك مع بصمة الشهادة المرتبطة بمعرّف العميل. للتأكّد من ذلك، عليك أولاً التحقّق من الملف المرجعي لشهادة SHA1 على النحو التالي:
ابحث عن ملف الشهادة واحصل على الملف المرجعي لشهادة SHA1. للحصول على بصمة SHA1، شغِّل الأمر التالي:
keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -vدوِّن تسلسل الأرقام السداسية العشرية التي تحمل التصنيف
SHA1:في الناتج. هذا هو الملف المرجعي لشهادتك.
بعد ذلك، تأكَّد من أنّ أداة الإنشاء تستخدم هذه الشهادة:
- أنشئ حِزمة APK للعبة من أداة الإنشاء ووقِّعها باستخدام الشهادة المطلوبة. انسخ حِزمة APK التي تم إنشاؤها إلى دليل مؤقت.
في الدليل المؤقت، نفِّذ الأمر التالي لفك ضغط حزمة APK.
unzip YourGame.apkأنشئ مفتاحًا خاصًا باستخدام ملف شهادة RSA:
keytool -printcert -file META-INF/CERT.RSAبدلاً من ذلك، يمكنك إنشاء المفتاح الخاص باستخدام ملف شهادة DSA:
keytool -printcert -file META-INF/CERT.DSAلاحظ تسلسل الأرقام السداسية العشرية في السطر الذي يحمل التصنيف
SHA1:.يجب أن يتطابق تسلسل الأرقام هذا مع بصمة الشهادة من الخطوة السابقة. في حال عدم التطابق، يعني ذلك أنّ أداة الإنشاء أو النظام غير مضبوطَين لتوقيع تطبيقك باستخدام شهادتك. في هذه الحالة، راجِع مستندات بيئة الإنشاء لتحديد كيفية إعدادها بشكل صحيح وحاوِل إثبات الهوية مرة أخرى.
بعد ذلك، تحقَّق مما إذا كانت بصمة الشهادة تتطابق مع البصمة التي تم ضبطها في معرّف العميل. ولإجراء ذلك:
- افتح Play Console وانتقِل إلى لعبتك.
- في صفحة تفاصيل اللعبة، انتقِل إلى أسفل الصفحة وانقر على الرابط المؤدي إلى مشروع Google Cloud Platform المرتبط.
- اختَر مشروعك.
- في الشريط الجانبي الأيمن، انقر على واجهات برمجة التطبيقات والمصادقة. تأكَّد من أنّ حالة واجهة برمجة التطبيقات لخدمات ألعاب Google Play هي مفعَّلة في قائمة واجهات برمجة التطبيقات المعروضة.
- في الشريط الجانبي الأيمن، اختَر التطبيقات المسجّلة.
- وسِّع قسم "معرّف عميل OAuth 2.0" ودوِّن الملف المرجعي للشهادة (SHA1).
إذا لم تتطابق هذه البصمة مع بصمة شهادتك من الخطوات السابقة، عليك إنشاء معرّف عميل جديد باستخدام بصمة الشهادة الصحيحة. يجب إنشاء معرّف العميل الجديد في Play Console، وليس في مشروع Google Cloud Platform.
التأكّد من تفعيل الحسابات التجريبية
قبل نشر لعبة، يجب تفعيل الحساب الذي أنشأ اللعبة في Play Console كحساب مختبِر أيضًا. للتأكّد من إعداد ذلك بشكل صحيح، اتّبِع الخطوات التالية:
- افتح Play Console وانتقِل إلى لعبتك.
- افتح علامة التبويب الاختبار.
- تأكَّد من أنّ الحساب الذي تحاول المصادقة عليه مدرَج في قائمة المختبِرين.
إذا لم يكن الحساب الذي تحاول المصادقة عليه مُدرَجًا، أضِفه إلى القائمة وانتظر بضع دقائق ثم حاوِل المصادقة مرة أخرى.
مشاكل Proguard
إذا كنت تستخدم Proguard وظهرت لك أخطاء في حزمة APK التي تم تشويشها، تحقَّق من مستوى واجهة برمجة التطبيقات المستهدَف في AndroidManifest.xml. تأكَّد من ضبطه على 17 أو أعلى.
أسباب أخرى لمشاكل الإعداد
تحقَّق من الأسباب الشائعة الأخرى لحدوث الأخطاء:
- إذا كانت لعبتك منشورة، تأكَّد من نشر إعدادات اللعبة أيضًا (من الممكن نشر التطبيق بدون نشر إعدادات الألعاب). لإجراء ذلك، انتقِل إلى Google Play Console، ثم إلى تطبيقك، وتأكَّد من أنّ المربّع بجانب اسم اللعبة يشير إلى أنّها منشورة. إذا كانت تشير إلى حالة أخرى، مثل "جاهز للنشر" أو "جاهز للاختبار"، انقر على المربّع واختَر نشر اللعبة.
- إذا تعذّر عليك نشر لعبتك، تأكَّد من تفعيل الخيار يُفضّل استخدام هذا التطبيق في عمليات التثبيت الجديدة لمعرّف عميل واحد فقط.
المستمعون المجهولون
لا تستخدِم أدوات معالجة الأحداث المجهولة. المستمعون المجهولون هم عمليات تنفيذ لواجهة مستمع يتم تحديدها بشكل مضمّن، كما هو موضّح أدناه.
ImageManager im = ...;
// Anonymous listener -- dangerous:
im.loadImage(new ImageManager.OnImageLoadedListener() {
@Override
public void onImageLoaded(Uri uri, Drawable drawable) {
// ...code...
}
}
لا يمكن الاعتماد على أدوات معالجة الأحداث المجهولة الهوية لأنّ حزمة تطوير البرامج (SDK) في "ألعاب Play" تحتفظ بها كمرجع ضعيف، ما يعني أنّه قد تتم استعادتها بواسطة أداة جمع البيانات غير المرغوب فيها قبل استدعائها. بدلاً من ذلك، يجب تنفيذ أداة معالجة الأحداث باستخدام عنصر ثابت، مثل Activity.
public class MyActivity extends Activity
implements ImageManager.OnImageLoadedListener {
private void loadOurImages() {
ImageManager im = ...;
im.loadImage(this);
}
@Override
public void onImageLoaded(Uri uri, Drawable drawable) {
// ...code...
}
}