2012-10-13 13 views
26

आईओएस 6 में प्रमाणीकरण हैंडलर का उपयोग करते समय, गेम केंद्र लॉग इन दृश्य प्रस्तुत नहीं करेगा यदि उपयोगकर्ता इसे रद्द कर देता है। मुझे एहसास है कि गेम सेंटर 3 रद्द करने के प्रयासों के बाद एक ऐप लॉकआउट करेगा, लेकिन मैं केवल 2 प्रयासों के बारे में बात कर रहा हूं। अगर वे लॉगिन रद्द कर देते हैं, तो उन्हें ऐप छोड़ना होगा और खेल केंद्र से पहले वापस आना होगा प्रमाणीकरण के माध्यम से भी लॉगिन करना होगा हैंडलर फिर से सेट हो रहा है। आईओएस 6 में इस मामले को कैसे संभालना है इस पर कोई विचार है?आईओएस 6 गेम सेंटर प्रमाणीकृत हैंडलर रद्द करने के बाद लॉगिन नहीं कर सकता

यह ठीक काम करता है जब बड़े authenticateWithCompletionHandler विधि का उपयोग कर:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0 
    GKLocalPlayer.localPlayer.authenticateHandler = authenticateLocalPlayerCompleteExtended; 
#else 
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:authenticateLocalPlayerComplete]; 
#endif 

कारण यह मेरी अनुप्रयोग के लिए महत्वपूर्ण है कि यह बहु खिलाड़ी के लिए खेल केंद्र की आवश्यकता है। ऐप लॉन्च पर गेम सेंटर को प्रमाणीकृत करने का प्रयास करता है, लेकिन यदि उपयोगकर्ता रद्द करता है तो हम उन्हें फिर से लॉन्च नहीं करते हैं, इसलिए वे परेशान नहीं होंगे। हम जो करते हैं वह गेम सेंटर लॉगिन बटन दिखाता है यदि वे बहु-खिलाड़ी चुनते समय लॉग इन नहीं होते हैं। लॉगिन बटन प्रमाणीकरण WithCompletionHandler (और अब GKLocalPlayer.localPlayer.authenticateHandler को सेट करके) को कॉल करके एक गेम सेंटर लॉगिन को मजबूर करता है।

+1

ऐसा लगता है कि आप इस पहले से ही कर रहे हैं, लेकिन बुला [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler: शून्य] का कारण होगा authenticateHandler एक प्रमाणीकरण दृश्य नियंत्रक के साथ फिर से कहा जाता है। आईओएस 6 में हालांकि इस विधि को बहिष्कृत किया गया है। – Greg

+0

मैं इसे काम करने के लिए अवमूल्यित कॉल का उपयोग कर रहा हूं, लेकिन मैं बहिष्कृत कॉल का उपयोग किए बिना ऐसा करने का "सही" तरीका ढूंढ रहा हूं। मैंने नया GKLocalPlayer.localPlayer.authenticateHandler को शून्य करने के लिए और फिर मेरे हैंडलर पर वापस देखने की कोशिश की कि यह काम करेगा या नहीं, और इसे अपील करने की कोशिश करने का अपवाद मिला।मैंने यह देखने के लिए एक अलग हैंडलर पर सेट करने की कोशिश नहीं की कि यह लॉगिन करेगा (जो वास्तव में हैकी लग रहा था) –

+0

मैंने हैंडलर को दूसरे हैंडलर पर स्विच करने का प्रयास किया है, और यह भी एक नया लॉगिन संवाद खोलने को ट्रिगर नहीं करता है । मैंने डेवलपर मंचों पर पोस्ट किया है कि किसी को कोई सलाह है या नहीं, और अगर मैं कुछ सुनूं तो यहां वापस पोस्ट करूंगा। https://devforums.apple.com/message/744983 – Greg

उत्तर

2

प्रीप्रोसेसर #if स्टेटमेंट्स के बजाए रनटाइम चेक (इंस्टेंस रीस्पॉन्डटोइलेक्टर :) का बेहतर उपयोग करें, ताकि आप अनुशंसित विधियों का उपयोग कर सकें जहां वे उपलब्ध हैं और कहीं और गिरावट कर रहे हैं। मैं वास्तव में पाया के रूप में प्रमाणीकरण हैंडलर भी एक शून्य दृश्य नियंत्रक के साथ कहा जाता है हो सकता है मैं, हैंडलर को आमंत्रित करने से पहले तीन मामलों भेद करने के लिए की जरूरत है:

-(void)authenticateLocalPlayer 
{ 
    if ([[GKLocalPlayer class] instancesRespondToSelector:@selector(setAuthenticateHandler:)]) { 
     [[GKLocalPlayer localPlayer] setAuthenticateHandler:^(UIViewController *gameCenterLoginViewController, NSError *error) { 
      if (gameCenterLoginViewController) { 
       [self.presentedViewController presentViewController:gameCenterLoginViewController 
                  animated:YES 
                  completion:^{ 
                   [self setInviteHandlerIfAuthenticated]; 
                  }]; 
      } else { 
       [self setInviteHandlerIfAuthenticated]; 
      } 
     }]; 
    } else { // alternative for iOS < 6 
     [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) { 
      [self setInviteHandlerIfAuthenticated]; 
     }]; 
    } 
} 

फिर भी अधिक मामलों matchForInvite के रूप में आमंत्रित हैंडलर के भीतर प्रतिष्ठित किया जाना चाहिए: : के रूप में अच्छी iOS6 में नया है और खेल केंद्र दृश्य नियंत्रक के माध्यम से अभी तक एक और दौर से बचा जाता है:

-(void)setInviteHandlerIfAuthenticated 
{ 
    if ([GKLocalPlayer localPlayer].isAuthenticated) { 
     [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) { 
      if (acceptedInvite) { 
       if ([GKMatchmaker instancesRespondToSelector:@selector(matchForInvite:completionHandler:)]) { 
        [self showInfoAnimating:YES completion:NULL]; 
        [[GKMatchmaker sharedMatchmaker] matchForInvite:acceptedInvite 
                completionHandler:^(GKMatch *match, NSError *error) { 
                 // ... handle invited match 
                }]; 
       } else { 
        // alternative for iOS < 6 
        GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite] autorelease]; 
        mmvc.matchmakerDelegate = self; 
        // ... present mmvc appropriately 
        // ... handle invited match found in delegate method matchmakerViewController:didFindMatch: 
       } 
      } else if (playersToInvite) { 
       // ... handle match initiated through game center 
      } 
     }; 
    } 
} 

मुझे पता है कि अगर यह मदद करता है करते हैं।

+1

प्रीप्रोसेसर मैक्रोज़ सिर्फ डीबगिंग और समस्या दिखाने के लिए थे। मेरी समस्या यह है कि यदि आप गेम सेंटर द्वारा दिखाए गए प्रारंभिक लॉगिन को रद्द करते हैं तो आप आईओएस 6 सार्वजनिक एपीआई का उपयोग करके लॉगिन ट्रिगर नहीं कर सकते हैं। प्री-आईओएस 6 एपीआई इस व्यवहार को हैंडलर को रीसेट करने का समर्थन करता है। –

0

मुझे नहीं लगता कि यह आईओएस 6.0 में संभव है। शुरुआती एसडीके बिल्डों में इसे करने के लिए एपीआई कॉल किए गए थे जिन्हें रिलीज से पहले हटा दिया गया था।

में WWDC 2012 वीडियो: - सत्र 516 खेल केंद्र [08:30] के साथ अपने खेल का घालमेल वे वास्तव में जहां एक authenticate विधि कॉल कोड दिखाने:

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
localPlayer.authenticationHandler = //handle the callback... 
[localPlayer authenticate]; 

इस विधि अब निजी एपीआई है, लेकिन आप कार्रवाई में इसे देख सकते हैं फोन करके:

[[GKLocalPlayer localPlayer] performSelector:@selector(_authenticate)]; 

यह करता है कि वास्तव में आप क्या चाहते हैं, लेकिन क्योंकि यह अब निजी है नहीं किया जा सकता।


तुम भी UIApplicationWillEnterForegroundNotification अधिसूचना पोस्टिंग द्वारा प्रमाणीकरण प्रक्रिया को गति प्रदान कर सकते हैं:

[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication]]; 

मुझे लगता है यह लाइव कोड में यह करने के लिए unadvisable होगा।

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