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

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

การบันทึก

หากต้องการแก้ปัญหาเกี่ยวกับเกม คุณสามารถเปิดการบันทึกแบบละเอียด ในอุปกรณ์ได้โดยใช้คำสั่ง adb shell จากนั้นคุณจะดู ข้อความบันทึกของบริการเกม Google Play ได้โดยใช้ logcat

เปิดใช้งานการทำบันทึก

วิธีเปิดใช้การบันทึกในอุปกรณ์ทดสอบ

  1. เชื่อมต่ออุปกรณ์กับเครื่องที่ติดตั้ง Android SDK

  2. เปิดเทอร์มินัลแล้วเรียกใช้คำสั่งนี้

    adb shell setprop log.tag.Games VERBOSE
  3. เรียกใช้เกมในอุปกรณ์และจำลองปัญหาที่คุณพยายาม แก้ไขข้อบกพร่อง

  4. ดูบันทึก

    adb logcat

ปิดใช้การบันทึก

หากต้องการปิดใช้การบันทึกแบบละเอียดสำหรับบริการเกม Play ในอุปกรณ์และ ย้อนกลับไปใช้ลักษณะการทำงานของการบันทึกเดิม ให้เรียกใช้คำสั่งต่อไปนี้

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: ใน เอาต์พุต นั่นคือลายนิ้วมือของใบรับรอง

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

  1. สร้าง APK ของเกมจากเครื่องมือบิลด์และลงนามด้วยใบรับรองที่ต้องการ คัดลอก 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:

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

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

  1. เปิด Play Console แล้วไปที่เกมของคุณ
  2. ในหน้ารายละเอียดเกม ให้เลื่อนไปที่ด้านล่างสุด แล้วคลิกลิงก์ไปยังโปรเจ็กต์ Google Cloud Platform ที่ลิงก์
  3. เลือกโปรเจ็กต์
  4. เลือก API และการให้สิทธิ์ในแถบด้านข้างทางซ้าย ตรวจสอบว่าสถานะ 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 แล้วไปที่แอปของคุณ จากนั้นตรวจสอบว่าช่องข้างชื่อเกมระบุว่าเกมเผยแพร่แล้ว หากระบุว่าอยู่ในสถานะอื่น เช่น "พร้อมเผยแพร่" หรือ "พร้อมทดสอบ" ให้คลิกช่อง แล้วเลือกเผยแพร่เกม
  • หากเผยแพร่เกมไม่ได้ ให้ตรวจสอบว่า Client ID อย่างน้อย 1 รายการเปิดใช้ตัวเลือกแอปนี้ เหมาะสำหรับการติดตั้งใหม่

ผู้ฟังที่ไม่ระบุชื่อ

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

    ImageManager im = ...;

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

Listener แบบไม่ระบุตัวตนไม่น่าเชื่อถือเนื่องจาก Play Games SDK จะเก็บไว้เป็น WeakReference ซึ่งหมายความว่า Garbage Collector อาจเรียกคืน Listener เหล่านี้ก่อนที่จะมีการ เรียกใช้ แต่คุณควรใช้ 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...
        }
    }