פתרון בעיות ב-Play Games Services במשחקי Android

בדף הזה נסביר איך לפתור בעיות שאתם עשויים להיתקל בהן פיתוח משחקים ל-Android באמצעות Google Play Games Services.

רישום

כדי לפתור בעיות במשחק, אפשר להפעיל רישום מפורט ביומן במכשיר באמצעות הפקודה adb shell. לאחר מכן אפשר לראות הודעות ביומן של Google Play Games Services באמצעות Logcat.

הפעלת רישום

כדי להפעיל את הרישום ביומן במכשיר הבדיקה:

  1. מחברים את המכשיר למחשב שבו מותקן Android SDK.

  2. פותחים טרמינל ומריצים את הפקודה הבאה:

    adb shell setprop log.tag.Games VERBOSE
  3. אפשר להריץ את המשחק במכשיר ולשחזר את הבעיה שניסית לשחזר לנפות באגים.

  4. צפייה ביומנים:

    adb logcat

השבתת רישום ביומן

כדי להשבית רישום מפורט ביומן ל-Play Games Services במכשיר חוזרים להתנהגות הרישום המקורית, מריצים את הפקודה הבאה:

adb shell setprop log.tag.Games INFO

לא ניתן להיכנס

אם לא ניתן להכניס שחקנים למשחק, צריך קודם לוודא פעל לפי ההוראות כדי ליצור את מזהי הלקוח וגם הגדרת שירותי משחקים. אם עדיין נתקלת בשגיאות בכניסה לחשבון, צריך לבדוק את הפריטים הבאים כדי לוודא שהמשחק מוגדר בצורה נכונה.

בדיקה של תגי המטא-נתונים

AndroidManifest.xml חייב להכיל תג מטא-נתונים של משחקים. כדי לאמת זאת תגי המטא-נתונים שלכם מוגדרים בצורה תקינה:

  1. פותחים את AndroidManifest.xml ומוודאים שהוא מכיל תג meta-data כמו שמוצג בהמשך:

    <meta-data android:name="com.google.android.gms.games.APP_ID"
        android:value="@string/app_id" />
    
  2. מאתרים את ההגדרה של המשאב @string/app_id. בדרך כלל מוגדר בקובץ XML נמצאים בספרייה res/xml, לדוגמה res/xml/strings.xml או res/xml/ids.xml.

  3. מוודאים שהערך של המשאב @string/app_id תואם למזהה המספרי של האפליקציה. הערך של המשאב הזה יכול להכיל רק ספרות. לדוגמה:

    <string name="app_id">123456789012</string>
    

בדיקת שם החבילה

שם החבילה של המשחק חייב להתאים לשם החבילה במזהה הלקוח. כדי לאמת את שם החבילה:

  1. צריך לפתוח את AndroidManifest.xml ולוודא ששם החבילה של המשחק נכון. החבילה name הוא הערך של המאפיין package בתג manifest.

  2. צריך לאמת את שם החבילה שסיפקתם כשיצרתם את מזהה הלקוח. כדי לאמת שם החבילה ב-Google Play Console, עוברים אל Play Console ולוחצים על הרשומה המתאימה למשחק.

  3. עוברים לכרטיסייה אפליקציות מקושרות ובודקים את הרשימה של מזהי הלקוח. יש צריך להיות אפליקציה מקושרת ל-Android ברשימה הזו ששם החבילה שלה תואם שם החבילה בAndroidManifest.xml. אם יש אי התאמה, צריך ליצור מזהה לקוח עם שם החבילה הנכון ומנסים להיכנס שוב.

בדיקה של טביעת האצבע לאישור

האישור שאיתו חותמים על המשחק צריך להיות תואם טביעת אצבע לאישור שמשויכת למזהה הלקוח שלך. כדי לאמת את זה, קודם יש לבדוק את טביעת האצבע SHA1 של האישור באופן הבא:

  1. מאתרים את קובץ האישור ומשיגים את טביעת האצבע מסוג SHA1. כדי לקבל את טביעת אצבע SHA1, מריצים את הפקודה הבאה:

    keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v
    
  2. חשוב לשים לב לרצף הספרות ההקסדצימליות שמסומנות בתווית SHA1: הפלט. זו טביעת האצבע של האישור.

בשלב הבא, צריך לוודא שכלי ה-build משתמש באישור הזה:

  1. יוצרים את ה-APK של המשחק מכלי ה-build וחותמים עליו עם אישור. מעתיקים את ה-APK שנוצר לספרייה זמנית.
  2. בספרייה הזמנית, מריצים את הפקודה הבאה כדי לחלץ את קובץ ה-APK.

    unzip YourGame.apk
    
  3. יצירת מפתח פרטי באמצעות קובץ אישור RSA:

    keytool -printcert -file META-INF/CERT.RSA
    

    לחלופין, אפשר ליצור את המפתח הפרטי באמצעות קובץ אישור של DSA:

    keytool -printcert -file META-INF/CERT.DSA
    
  4. חשוב לשים לב לרצף של הספרות ההקסדצימליות בשורה SHA1:.

    רצף הספרות הזה אמור להתאים לטביעת האצבע של האישור לשלב הקודם. אם יש אי-התאמה, המשמעות היא שהכלי או מערכת ה-build שלך לא מוגדר לחתום על הבקשה באמצעות האישור שלך. במקרה הזה, צריך לעיין בתיעוד של סביבת ה-build כדי לקבוע איך להגדיר ולנסות להיכנס שוב.

בשלב הבא, בודקים אם טביעת האצבע לאישור תואמת לטביעת האצבע שהוגדרה במזהה הלקוח שלכם. לשם כך:

  1. פותחים את Play Console ועוברים למשחק.
  2. בדף פרטי המשחק, גוללים לחלק התחתון ולוחצים על הקישור לפרויקט Google Cloud Platform שמקושר.
  3. בוחרים את הפרויקט.
  4. בסרגל הצד שמימין, בוחרים באפשרות APIs & auth. צריך לוודא שהאלמנטים הסטטוס של ה-API של Google Play Games Services הוא מופעל ברשימה שמוצגת של ממשקי ה-API.
  5. בסרגל הצד שמימין, בוחרים באפשרות אפליקציות רשומות.
  6. מרחיבים את הקטע 'מזהה לקוח של OAuth 2.0' ומעיינים באישור טביעת אצבע (SHA1).

אם טביעת האצבע הזו לא תואמת לטביעת האצבע של האישור את השלבים הקודמים, צריך ליצור מזהה לקוח חדש עם האישור הנכון טביעת אצבע. צריך ליצור את מזהה הלקוח החדש בקובץ Play Console, לא בפרויקט Google Cloud Platform.

איך מוודאים שחשבונות הבדיקה מופעלים

לפני פרסום המשחק, החשבון שיצר את המשחק יש להפעיל את Play Console גם כבודקים. כדי לבדוק אם הוא מוגדר בצורה נכונה:

  1. פותחים את Play Console ועוברים למשחק.
  2. פותחים את הכרטיסייה בדיקות.
  3. ודאו שהחשבון שבאמצעותו אתם מנסים להיכנס נמצא ברשימה של בודקים.

אם החשבון שאיתו ניסית להיכנס לא מופיע, צריך להוסיף אותו לרשימה, להמתין כמה דקות ומנסה להיכנס שוב.

בעיות הגנה

אם משתמשים ב-ProGuard ומופיעות שגיאות ב-APK המעורפל, צריך לבדוק את רמת ה-API המטורגטת במכשיר AndroidManifest.xml. הקפידו להגדיר אותו לערך 17 ומעלה.

סיבות אחרות לבעיות בהגדרה

מחפשים סיבות נפוצות נוספות לשגיאות:

  • אם המשחק שלכם פורסם, ודאו שגם הגדרות המשחק מתפרסמות (ייתכן ש לפרסם את האפליקציה בלי לפרסם את הגדרות המשחקים). כדי לעשות את זה, עוברים אל עוברים אל האפליקציה ב-Google Play Console, ומוודאים שהתיבה לצד שם המשחק מציינת שהיא פורסמה. אם מצוין שהוא במצב אחר, למשל 'מוכן לפרסום' או "Ready to Test" (מוכן לבדיקה), לוחצים על התיבה ובוחרים באפשרות Publish Game (פרסום המשחק).
  • אם לא ניתן לפרסם את המשחק, יש לוודא שבדיוק אחד ממזהי הלקוח מכיל את המזהה האפליקציה הזו האפשרות המועדפת להתקנות חדשות מופעלת.

מאזינים אנונימיים

אסור להשתמש במאזינים אנונימיים. מאזינים אנונימיים הם הטמעות של ממשק האזנה שמוגדרים בתוך השורה, כפי שמתואר בהמשך.

    ImageManager im = ...;

    // Anonymous listener -- dangerous:
    im.loadImage(new ImageManager.OnImageLoadedListener() {
        @Override
        public void onImageLoaded(Uri uri, Drawable drawable) {
            // ...code...
        }
    }

מאזינים אנונימיים לא מהימנים כי ה-SDK של Play Games שומר אותם כקובצי עזר חלשים, כלומר, יכול להיות שהם ייאספו על ידי אוסף האשפה לפני שהם הופעלה. במקום זאת, צריך להטמיע את ה-listener באמצעות אובייקט קבוע כמו 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...
        }
    }