การแก้ปัญหาบริการเกมของ Play ในเกม Android

หน้านี้จะอธิบายวิธีแก้ปัญหาที่คุณอาจพบขณะพัฒนาเกม Android ด้วยบริการ Google Play Games

การบันทึก

หากต้องการแก้ปัญหาเกี่ยวกับเกม ให้เปิดการบันทึกแบบละเอียดในอุปกรณ์โดยใช้คำสั่ง adb shell จากนั้นคุณดูข้อความบันทึกของบริการ Google Play Games ได้โดยใช้ 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. จดจําลําดับตัวเลขฐาน 16 ที่ทําเครื่องหมาย SHA1: ในเอาต์พุต นั่นคือลายนิ้วมือของใบรับรอง

ถัดไป ให้ตรวจสอบว่าเครื่องมือสร้างของคุณใช้ใบรับรองนี้อยู่

  1. สร้าง APK ของเกมจากเครื่องมือสร้างและลงนามด้วยใบรับรองที่ต้องการ คัดลอก APK ที่สร้างขึ้นไปยังไดเรกทอรีชั่วคราว
  2. ในไดเรกทอรีชั่วคราว ให้เรียกใช้คำสั่งต่อไปนี้เพื่อแตกไฟล์ ZIP ของ APK

    unzip YourGame.apk
    
  3. สร้างคีย์ส่วนตัวโดยใช้ไฟล์ใบรับรอง RSA โดยทำดังนี้

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

    หรือจะสร้างคีย์ส่วนตัวโดยใช้ไฟล์ใบรับรอง DSA ก็ได้ โดยทำดังนี้

    keytool -printcert -file META-INF/CERT.DSA
    
  4. สังเกตลำดับตัวเลขฐานสิบหกในบรรทัดที่ระบุว่า SHA1:

    ลำดับตัวเลขนี้ควรตรงกับลายนิ้วมือของใบรับรองจากขั้นตอนก่อนหน้า หากไม่ตรงกัน แสดงว่าเครื่องมือหรือระบบบิลด์ไม่ได้กําหนดค่าให้ลงนามแอปพลิเคชันด้วยใบรับรอง ในกรณีนี้ ให้อ่านเอกสารประกอบของสภาพแวดล้อมการสร้างเพื่อดูวิธีกำหนดค่าอย่างถูกต้อง แล้วลองลงชื่อเข้าใช้อีกครั้ง

ถัดไป ให้ตรวจสอบว่าลายนิ้วมือของใบรับรองตรงกับลายนิ้วมือที่กําหนดค่าไว้ในรหัสไคลเอ็นต์หรือไม่ หากต้องการทำสิ่งต่อไปนี้

  1. เปิด Play Console แล้วไปที่เกมของคุณ
  2. ในหน้ารายละเอียดเกม ให้เลื่อนไปที่ด้านล่างแล้วคลิกลิงก์ไปยังโปรเจ็กต์ Google Cloud Platform ที่ลิงก์
  3. เลือกโปรเจ็กต์
  4. ในแถบด้านข้างทางซ้าย ให้เลือกAPI และการรับรอง ตรวจสอบว่าสถานะ API บริการเกมของ Google Play เป็นเปิดในรายการ API ที่แสดง
  5. ในแถบด้านข้างทางซ้าย ให้เลือกแอปที่ลงทะเบียน
  6. ขยายส่วนรหัสไคลเอ็นต์ OAuth 2.0 และจดลายนิ้วมือใบรับรอง (SHA1)

หากลายนิ้วมือนี้ไม่ตรงกับลายนิ้วมือของใบรับรองจากขั้นตอนก่อนหน้า คุณต้องสร้างรหัสไคลเอ็นต์ใหม่ที่มีลายนิ้วมือของใบรับรองที่ถูกต้อง คุณต้องสร้างรหัสไคลเอ็นต์ใหม่ใน Play Console ไม่ใช่ในโปรเจ็กต์ Google Cloud Platform

ตรวจสอบว่าเปิดใช้บัญชีทดสอบแล้ว

ก่อนที่จะเผยแพร่เกม บัญชีที่สร้างเกมใน Play Console จะต้องเปิดใช้เป็นผู้ทดสอบด้วย วิธีตรวจสอบว่ามีการกําหนดค่าอย่างถูกต้อง

  1. เปิด Play Console แล้วไปที่เกมของคุณ
  2. เปิดแท็บการทดสอบ
  3. ตรวจสอบว่าบัญชีที่คุณพยายามลงชื่อเข้าใช้อยู่ในรายชื่อผู้ทดสอบ

หากบัญชีที่คุณพยายามลงชื่อเข้าใช้ไม่อยู่ในรายการ ให้เพิ่มบัญชีนั้นลงในรายการ รอ 2-3 นาที แล้วลองลงชื่อเข้าใช้อีกครั้ง

ปัญหาเกี่ยวกับ Proguard

หากคุณใช้ Proguard และเห็นข้อผิดพลาดใน APK ที่มีการสร้างความสับสน ให้ตรวจสอบระดับ API เป้าหมายใน AndroidManifest.xml ตรวจสอบว่าได้ตั้งค่าเป็น 17 ขึ้นไป

สาเหตุอื่นๆ ของปัญหาการตั้งค่า

ตรวจสอบสาเหตุที่พบบ่อยอื่นๆ ของข้อผิดพลาด

  • หากเผยแพร่เกมแล้ว ให้ตรวจสอบว่าได้เผยแพร่การตั้งค่าเกมด้วย (คุณเผยแพร่แอปพลิเคชันโดยไม่เผยแพร่การตั้งค่าเกมได้) โดยไปที่ Google Play Console แล้วไปที่แอปของคุณ จากนั้นตรวจสอบว่าช่องข้างชื่อเกมระบุว่าเผยแพร่แล้ว หากระบุว่าเกมอยู่ในสถานะอื่น เช่น "พร้อมเผยแพร่" หรือ "พร้อมทดสอบ" ให้คลิกช่องแล้วเลือกเผยแพร่เกม
  • หากเผยแพร่เกมไม่ได้ ให้ตรวจสอบว่ารหัสไคลเอ็นต์อย่างน้อย 1 รายการเปิดใช้ตัวเลือกแนะนำให้ใช้แอปนี้สำหรับการติดตั้งใหม่

ผู้ฟังที่ไม่ระบุตัวตน

อย่าใช้ Listeners ที่ไม่ระบุตัวบุคคล ตัวแฟังที่ไม่ระบุตัวตนคือการใช้งานอินเทอร์เฟซตัวฟังที่กําหนดไว้แบบอินไลน์ดังที่แสดงด้านล่าง

    ImageManager im = ...;

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

ตัวแฟังที่ไม่ระบุตัวตนไม่น่าเชื่อถือเนื่องจาก Play Games SDK เก็บรักษาตัวแฟังเหล่านี้เป็นข้อมูลอ้างอิงแบบอ่อน ซึ่งหมายความว่าระบบเก็บขยะอาจเรียกใช้ตัวแฟังเหล่านี้ก่อนที่จะมีการเรียกใช้ แต่คุณควรใช้ตัวรับฟังโดยใช้ออบเจ็กต์ถาวร เช่น 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...
        }
    }