בדף הזה מוסבר איך לפתור בעיות שאולי נתקלים בהן במהלך פיתוח משחקים ל-Android באמצעות Google Play Games Services.
רישום ביומן
כדי לפתור בעיות במשחק, אפשר להפעיל רישום מפורט ביומן במכשיר באמצעות הפקודה adb shell. אחר כך תוכלו להציג את הודעות היומן של Google Play Games Services באמצעות logcat.
הפעלת רישום
כדי להפעיל את הרישום ביומן במכשיר הבדיקה:
מחברים את המכשיר למחשב שמותקן בו Android SDK.
פותחים טרמינל ומריצים את הפקודה הבאה:
adb shell setprop log.tag.Games VERBOSE
מריצים את המשחק במכשיר ומשחזרים את הבעיה שרוצים לנפות.
צפייה ביומנים:
adb logcat
השבתת רישום ביומן
כדי להשבית את הרישום המפורט ביומן של Play Games Services במכשיר ולחזור להתנהגות הרישום המקורית ביומן, מריצים את הפקודה הבאה:
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:בפלט. זו טביעת האצבע של האישור.
לאחר מכן, בודקים שכלי ה-build משתמש באישור הזה:
- יוצרים את קובץ ה-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.
- בוחרים את הפרויקט הרצוי.
- בסרגל הצד שמימין, לוחצים על APIs & auth (ממשקי API והרשאות). מוודאים שהסטטוס של Google Play Games Services API הוא ON ברשימת ממשקי ה-API שמוצגת.
- בסרגל הצד שמימין, בוחרים באפשרות אפליקציות רשומות.
- מרחיבים את הקטע 'מזהה לקוח ב-OAuth 2.0' ורושמים את טביעת האצבע של האישור (SHA1).
אם טביעת האצבע הזו לא תואמת לטביעת האצבע של האישור מהשלבים הקודמים, צריך ליצור מזהה לקוח חדש עם טביעת האצבע הנכונה של האישור. צריך ליצור את מזהה הלקוח החדש ב-Play Console, ולא בפרויקט Google Cloud Platform.
בדיקה שהחשבונות לניסוי מופעלים
לפני שמפרסמים משחק, צריך להפעיל את החשבון שדרכו נוצר המשחק ב-Play Console כחשבון בדיקה. כדי לבדוק שההגדרה הזו בוצעה בצורה נכונה:
- פותחים את Play Console ועוברים למשחק.
- פותחים את הכרטיסייה בדיקה.
- בודקים שהחשבון שאיתו מנסים לבצע אימות מופיע ברשימת הבודקים.
אם החשבון שאיתו אתם מנסים לבצע אימות לא מופיע ברשימה, מוסיפים אותו לרשימה, מחכים כמה דקות ומנסים לבצע אימות שוב.
בעיות ב-Proguard
אם אתם משתמשים ב-Proguard ומוצגות שגיאות ב-APK שעבר אובפוסקציה, כדאי לבדוק את רמת ה-API לטירגוט ב-AndroidManifest.xml. חשוב להגדיר את הגרסה ל-17 ומעלה.
סיבות אחרות לבעיות בהגדרה
בודקים אם יש סיבות נפוצות אחרות לשגיאות:
- אם המשחק פורסם, צריך לוודא שהגדרות המשחק פורסמו גם כן (אפשר לפרסם את האפליקציה בלי לפרסם את הגדרות המשחק). כדי לעשות זאת, עוברים אל Google Play Console, נכנסים לאפליקציה ומוודאים שהתיבה לצד שם המשחק מסומנת, מה שמציין שהמשחק פורסם. אם מצוין שהמשחק נמצא במצב אחר, כמו 'מוכן לפרסום' או 'מוכן לבדיקה', לוחצים על התיבה ובוחרים באפשרות פרסום המשחק.
- אם אתם לא מצליחים לפרסם את המשחק, בדקו שרק לאחד ממזהי הלקוח מופעלת האפשרות 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...
}
}
הסתמכות על מאזינים אנונימיים היא בעייתית כי Play Games SDK שומר אותם כהפניות חלשות, מה שאומר שהם עלולים להימחק על ידי איסוף האשפה לפני שהם מופעלים. במקום זאת, צריך להטמיע את ה-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...
}
}