פתרון בעיות ב-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 במכשיר ולחזור להתנהגות המקורית של הרישום ביומן, מריצים את הפקודה הבאה:

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 ומוודאים ששם החבילה של המשחק נכון. שם החבילה הוא הערך של המאפיין 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. מוודאים שהסטטוס של Google Play Games Services API הוא מופעל ברשימה של ממשקי ה-API המוצגים.
  5. בסרגל הצד שמימין, בוחרים באפשרות אפליקציות רשומות.
  6. מרחיבים את הקטע 'מזהה לקוח ב-OAuth 2.0' ומתעדים את טביעת האצבע של האישור (SHA1).

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

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

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

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

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

בעיות ב-Proguard

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

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

כדאי לבדוק אם יש סיבות נפוצות אחרות לשגיאות:

  • אם המשחק שלך פורסם, צריך לבדוק אם גם ההגדרות של המשחק פורסמו (אפשר לפרסם את האפליקציה בלי לפרסם את הגדרות המשחק). כדי לעשות זאת, עוברים אל Google Play Console, עוברים לאפליקציה ובודקים שהתיבה לצד שם המשחק מסומנת, כלומר שהמשחק פורסם. אם הסטטוס הוא אחר, למשל 'מוכן לפרסום' או 'מוכן לבדיקה', לוחצים על התיבה ובוחרים באפשרות פרסום המשחק.
  • אם אתם לא מצליחים לפרסם את המשחק, עליכם לוודא שבאחד מ-ID הלקוח מופעלת האפשרות This app is preferred for new installations.

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

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

    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...
        }
    }