2013-01-08 20 views
8

ऑफलाइन मोड के मामले में गेम सेंटर में उपलब्धियों के साथ काम करने का सबसे अच्छा तरीका जानने का प्रयास करना (उदाहरण के लिए हवाई जहाज मोड चालू)।ऑफ़लाइन गेम सेंटर आईओएस उपलब्धियां

जहां तक ​​मैं समझता हूं कि आईओएस 5+ में गेम सेंटर ऑफ़लाइन सबमिट की गई उपलब्धियों और स्कोर का ख्याल रखता है। यह प्रॉक्सी कैश की तरह कार्य करता है और अगली बार उपयोगकर्ता ऑनलाइन होने पर उन्हें ऑनलाइन गेम सेंटर में सबमिट करता है। इसे ध्यान में रखते हुए मैं यह करता हूं:

उपयोगकर्ता प्रमाणीकरण सफलता में मैं उपलब्धियों को लोड करता हूं और उन्हें एक शब्दकोश में संग्रहीत करता हूं।

[GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *gcAchievments, NSError *error) 
{ 
    if (error) { ..skipped ..} 
    //This dictionary will store current achievments, so that we didn't submit them 
    //once more and didn't show notification. 
    achievments = [[NSMutableDictionary alloc] initWithCapacity:gcAchievments.count]; 

    //Storing achievments in dictionary 
    for(GKAchievement *a in gcAchievments) 
     [achievments setObject:a forKey:a.identifier];  
}]; 

बाद में जब मैं नई उपलब्धि मैं एक शब्दकोश में उपलब्धि के लिए जाँच करें और उपलब्धि पहले से ही पूरा हो गया है प्रस्तुत न करें प्रस्तुत । अगर मैं उपलब्धि जमा करता हूं तो मैं इसे achievments डिक्शनरी (इन-मेमोरी) में भी जोड़ता हूं ताकि यह सफलतापूर्वक पुनर्निर्मित हो सके कि यह उपलब्धि पहले ही सबमिट हो चुकी है।

GKAchievement *cachedAchievment = [achievments objectForKey:identifier]; 
if (cachedAchievment && cachedAchievment.percentComplete >= 100) 
{ 
    //Already unlocked this achievment. 
    return; 
} 

GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier: identifier]; 
if (achievement) 
{ 
    achievement.percentComplete = percent; 
    [achievement reportAchievementWithCompletionHandler:^(NSError *error) 
    { 
     if (!error) 
     { 
      //Flagging achievment as completed locally to avoid achieving it second time and showing notification. 
      [achievments setObject:achievement forKey:achievement.identifier]; 

      //Now shoing notification banner. 
      GKAchievementDescription * desc = [achievmentsDescriptions objectForKey:achievement.identifier]; 
      [[GKAchievementHandler defaultHandler] notifyAchievement:desc]; 
     } 
     else 
     { 
      NSLog(@"Error in reporting achievements: %@", error); 
     } 
    }]; 
} 

यह दृष्टिकोण मुझे गेम कोड बुद्धिमान में सबमिशन ट्रिगर करने की अनुमति देता है कि मैं दो बार प्राप्त करने या अधिसूचना बैनर दो बार दिखाऊंगा।

खेल केंद्र ऑनलाइन होने पर हर चीज ठीक काम करती है। लेकिन अगर मैं ऑफलाइन हूं तो मेरे पास 2 मुद्दे हैं।

  1. लोड हो रहा है कोड रिटर्न त्रुटि और achievments की प्रारंभिक शब्दकोश पहले ही पूरा उपलब्धियों के साथ तैयार नहीं हुआ है, इस के लिए हर बार उपयोगकर्ता फिर प्रत्येक उपलब्धि के लिए खेल वह/वह सूचना बैनर हो जाता है की शुरूआत है, भले ही यह पहले से ही प्रदान किया जाता है का मतलब है। फिर इसे शब्दकोश में रखा जाने के बाद यह प्रदर्शित नहीं होता है, लेकिन मैं प्रत्येक गेम शुरू होने के लिए भी एक बार उपलब्धियां नहीं दिखाना चाहता हूं।

  2. मुझे यकीन नहीं है कि ऑफ़लाइन सबमिट की गई उपलब्धियां गेम केंद्र पर पहुंच जाएंगी जब उपयोगकर्ता ऑनलाइन हो जाता है। मैं गेम लॉन्च के बीच उपलब्धि स्थिति को संग्रहीत करने के लिए लगातार स्टोरेज (जैसे डेटाबेस) का उपयोग करके समस्या # 1 को हल कर सकता हूं, लेकिन जब मुझे गेम सेंटर ऑनलाइन होता है तो मैं उन्हें पुनः सबमिट कर सकता हूं और मुझे यह पता कैसे लगाया जा सकता है कि गेम सेंटर वास्तव में ऑनलाइन है, क्योंकि ऑफलाइन reportAchievementWithCompletionHandler त्रुटियों के बिना पूरा करता है , इसलिए मैं यह नहीं पता लगा सकता कि यह सबमिट नहीं किया गया था। यहां बताया गया है कि मैं कैसे परीक्षण कर रहा हूं, मैंने हवाई जहाज मोड चालू कर दिया है, कुछ उपलब्धियों को अनलॉक कर दिया है, और फिर हवाई जहाज मोड बंद कर दिया है, उपलब्धियां गेम सेंटर तक नहीं पहुंचती हैं, हालांकि यह "सैंडबॉक्स" समस्या हो सकती है।

उत्तर

4

आप का उल्लेख "अनलॉक हो गया उपलब्धि" के लिए स्थायी भंडारण जोड़े और साथ ही प्रत्येक उपलब्धि के लिए एक "सफलतापूर्वक खेल केंद्र को प्रस्तुत" झंडा दुकान। फिर, ऑनलाइन होने पर, loadAchievementsWithCompletionHandler से स्टार्टअप पर परिणामों की जांच करें और समय-समय पर यह देखने के लिए कि प्रत्येक उपलब्धि unlocked && !submitted वास्तव में गेम सेंटर तक पहुंच गई है और यदि नहीं है तो पुनः सबमिट करें।

+0

अरे, क्या आप उपलब्धियों के प्रदर्शन के बारे में कुछ जानते हैं? http://stackoverflow.com/questions/42631583/calling-report-achievements-performance – Esqarrouth

संबंधित मुद्दे