Android गेम में Play की गेम सेवाओं से जुड़ी समस्या हल करना

इस पेज पर, Google Play Games Services का इस्तेमाल करके Android गेम डेवलप करते समय आने वाली समस्याओं को हल करने का तरीका बताया गया है.

लॉग इन हो रहा है

अपने गेम से जुड़ी समस्याओं को हल करने के लिए, adb shell कमांड का इस्तेमाल करके, अपने डिवाइस पर वर्बोस लॉगिंग चालू करें. इसके बाद, logcat का इस्तेमाल करके, Google Play Games Services के लॉग मैसेज देखे जा सकते हैं.

प्रवेश करना सक्षम करें

अपने टेस्ट डिवाइस पर लॉगिंग की सुविधा चालू करने के लिए:

  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 संसाधन की परिभाषा ढूंढें. आम तौर पर, इसे res/xml डायरेक्ट्री में मौजूद किसी एक्सएमएल फ़ाइल में तय किया जाता है. उदाहरण के लिए, res/xml/strings.xml या res/xml/ids.xml.

  3. पुष्टि करें कि @string/app_id संसाधन की वैल्यू, आपके ऐप्लिकेशन के न्यूमेरिक आईडी से मेल खाती हो. इस संसाधन की वैल्यू में सिर्फ़ अंक होने चाहिए. उदाहरण के लिए:

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

अपने पैकेज का नाम देखना

आपके गेम के पैकेज का नाम, आपके क्लाइंट आईडी पर दिए गए पैकेज के नाम से मेल खाना चाहिए. पैकेज के नाम की पुष्टि करने के लिए:

  1. AndroidManifest.xml खोलें और पुष्टि करें कि आपके गेम के पैकेज का नाम सही है. पैकेज का नाम, manifest टैग में मौजूद package एट्रिब्यूट की वैल्यू होती है.

  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. बाईं ओर मौजूद साइडबार में, एपीआई और पुष्टि करने की सुविधा को चुनें. पक्का करें कि दिखाई गई एपीआई की सूची में, Google Play की गेम सेवाओं से जुड़े एपीआई का स्टेटस चालू है के तौर पर दिखाया गया हो.
  5. बाईं ओर मौजूद साइडबार में, रजिस्टर किए गए ऐप्लिकेशन को चुनें.
  6. OAuth 2.0 क्लाइंट आईडी सेक्शन को बड़ा करें और सर्टिफ़िकेट फ़िंगरप्रिंट (SHA1) नोट करें.

अगर यह फ़िंगरप्रिंट, पिछले चरणों में दिए गए आपके सर्टिफ़िकेट के फ़िंगरप्रिंट से मेल नहीं खाता है, तो आपको सही सर्टिफ़िकेट फ़िंगरप्रिंट वाला नया क्लाइंट आईडी बनाना होगा. आपको नया क्लाइंट आईडी, Play Console में बनाना होगा. Google Cloud Platform प्रोजेक्ट में नहीं.

देखें कि टेस्ट खाते चालू हों

किसी गेम को पब्लिश करने से पहले, Play Console में गेम बनाने वाले खाते को टेस्टर के तौर पर भी चालू करना होगा. यह देखने के लिए कि इसे सही तरीके से कॉन्फ़िगर किया गया है या नहीं:

  1. Play Console खोलें और अपने गेम पर जाएं.
  2. टेस्टिंग टैब खोलें.
  3. देखें कि जिस खाते से पुष्टि की जा रही है वह टेस्टर की सूची में शामिल हो.

अगर आपको जिस खाते से पुष्टि करानी है वह सूची में नहीं है, तो उसे सूची में जोड़ें. इसके बाद, कुछ मिनट इंतज़ार करें और फिर से पुष्टि कराने की कोशिश करें.

Proguard से जुड़ी समस्याएं

अगर Proguard का इस्तेमाल किया जा रहा है और आपको धुंधले किए गए APK पर गड़बड़ियां दिख रही हैं, तो अपने AndroidManifest.xml पर टारगेट एपीआई लेवल की जांच करें. इसे 17 या इससे ज़्यादा पर सेट करें.

सेटअप से जुड़ी समस्याओं की अन्य वजहें

गड़बड़ियों की अन्य आम वजहें देखें:

  • अगर आपका गेम पब्लिश किया गया है, तो पक्का करें कि गेम की सेटिंग भी पब्लिश की गई हों. ऐसा हो सकता है कि गेम की सेटिंग पब्लिश किए बिना ही ऐप्लिकेशन पब्लिश कर दिया गया हो. इसके लिए, Google Play Console पर जाएं और अपने ऐप्लिकेशन पर जाएं. इसके बाद, देखें कि गेम के नाम के बगल में मौजूद बॉक्स में यह लिखा हो कि गेम पब्लिश हो गया है. अगर इससे पता चलता है कि गेम किसी दूसरी स्थिति में है, जैसे कि "पब्लिश करने के लिए तैयार" या "टेस्ट करने के लिए तैयार", तो बॉक्स पर क्लिक करें और गेम पब्लिश करें को चुनें.
  • अगर आपको गेम पब्लिश करने में समस्या आ रही है, तो पक्का करें कि किसी एक क्लाइंट आईडी के लिए, नए इंस्टॉलेशन के लिए, इस ऐप्लिकेशन को प्राथमिकता दी जाती है विकल्प चालू हो.

बिना पहचान वाले श्रोता

पहचान छिपाकर इवेंट सुनने वालों का इस्तेमाल न करें. पहचान छिपाकर सुनने वाले लोग, लिसनर इंटरफ़ेस को लागू करते हैं. इन्हें इनलाइन के तौर पर तय किया जाता है. इसके बारे में यहां बताया गया है.

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