2012-09-25 11 views
6

के साथ आईओएस 6 पर जीकेएलोकलप्लेयर ऑथ क्रैश मेरा ऐप रिकॉर्ड रखता है कि यह गेम सेंटर के साथ सफलतापूर्वक प्रमाणीकृत है या नहीं। जब यह एक नया गेम शुरू करता है या जब उपयोगकर्ता स्कोर सूची को देखता है, यदि कोई स्थानीय खिलाड़ी सफलतापूर्वक प्रमाणीकृत नहीं किया गया है, और यदि ऐप उस समय उपयोगकर्ता को प्रमाणीकृत करने का प्रयास करने के बीच में नहीं है, तो यह फिर से प्रयास करता है ।मॉडल ट्रांज़िशन त्रुटि

(क्यों? मामले में आप एक नेटवर्क क्षेत्र के लिए नो-नेटवर्क क्षेत्र से स्थानांतरित किया है।)

दुर्भाग्य से, iOS6/XCode 4.5 के तहत, यह दुर्घटनाग्रस्त शुरू कर दिया है। या कम से कम यह कुछ सीमित परिस्थितियों में प्रतीत होता है: जब कोई उपयोगकर्ता खराब पासवर्ड और/या उस खाते से लॉग इन करने में विफल रहता है जो मौजूद नहीं है। एक सफल लॉगिन पर, सब ठीक है।

2012-09-25 15: 54: 47.829 ऐप्लिकेशन का नाम

उसके बाद असफल लॉगिन, जब मैं जाने के लिए और कुछ है कि का कारण बनता है कर होने के लिये एक reauth जाँच मैं इस मिल [1493: 907] * अभिकथन विफलता में - [UIWindowController संक्रमण: fromViewController: toViewController: लक्ष्य: didEndSelector:], /SourceCache/UIKit/UIKit-2372/UIWindowController.m:211

तो यह वास्तव में दुर्घटनाओं:

2012-09-25 15: 55: 25.569 ऐप्लिकेशन का नाम [1493: 907] * समाप्त एप्लिकेशन न आया हुआ अपवाद 'NSInternalInconsistencyException' के कारण, कारण: '< GKModalRootViewController से एक मोडल संक्रमण शुरू करने का प्रयास : 0x1cd8b2a0 > से < GKHostedAuthenticateViewController: 0x1e31a350 > जबकि एक संक्रमण पहले से ही प्रगति पर है। (0x394932a3 0x31db297f 0x3949315d 0x383fd2af 0x3640377b 0x36402fcf 0x394969c4 0x393edfeb 0x36521733 0x32a83d2d 0x3264b11f 0x3264a4b7 0x3264f1bd 0x39466f3b 0x393d9ebd 0x393d9d49 0x353132eb 0x3636b301 0x7e863 0x7e808) libC++ अबी: viewDidAppear/viewDidDisappear पता करने के लिए के लिए वर्तमान संक्रमण पूर्ण कर लिया ' * पहले फेंक कॉल स्टैक प्रतीक्षा करें .dylib: एक अपवाद

फेंकने बुलाया समाप्त यह परेशानी कोड है:

-(void)authenticateLocalUser { 

    if (!self.checkingLocalPlayer) { 
     self.checkingLocalPlayer = YES; 
     GKLocalPlayer *thisPlayer = [GKLocalPlayer localPlayer]; 

     if (!thisPlayer.authenticated) { 

      [[GKLocalPlayer localPlayer] 
      authenticateWithCompletionHandler:^(NSError *error) 
      { 
       [self finishGameCenterAuthWithError:error]; 
      } 
      ]; 
     } 
    } 
} 

एक y विचार क्या मैं यहाँ गलत कर रहा हूँ?

उत्तर

7

Ggrrrhhh एक ही मुद्दा, मुझे लगता है कि मुझे यह पता चला है ... ios6 प्रमाणीकरण को हटा दिया गया हैथथप्लेशनशन हैंडलर लिंक देखें, प्रस्ताव है कि आप प्रमाणीकरण हैंडलर का उपयोग करते हैं।

http://developer.apple.com/library/IOS/#documentation/GameKit/Reference/GKLocalPlayer_Ref/Reference/Reference.html#//apple_ref/occ/instp/GKLocalPlayer/authenticateHandler

यह काम करने के लिए प्रकट होता है ...

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
[localPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) { 

//[localPlayer authenticateWithCompletionHandler:^(NSError *error) { OLD CODE! 
    if (localPlayer.isAuthenticated) 
    { 
     //do some stuff 
    } 
    else { 

     UIAlertView *alertView = [[UIAlertView alloc] 
            initWithTitle:@"NOT AUTHORISED" 
            message:@"YOUR'RE NOT LOGGED INTO GC." 
            delegate:self 
            cancelButtonTitle:@"OK" 
            otherButtonTitles:nil]; 
     [alertView show]; 

    } 
})]; 
+0

यह वास्तव में समस्या थी। मेरे पास एक और जवाब के रूप में पास कुछ अतिरिक्त टिप्पणियां मिली हैं। –

+0

हां, आईओएस 6 बनाम अन्य पर निर्माण के लिए धन्यवाद। मुझे विश्वास है कि वर्तमान मॉड्यूल व्यू कंट्रोलर आईओएस 6 के लिए चॉप सूची पर भी है। –

3

जेमी पश्चिम सही ढंग से कहा गया है कि समस्या iOS6, में authenticateHandler को बदलाव जो authenticateWithCompletionHandler छोड़ दिया है लगता था: टूट। चूंकि इसे हटा दिया गया है, इसलिए ऐप्पल अपनी बग को ठीक करने की संभावना नहीं है।

यहां मेरी हर चीज की आवश्यकता है।आईओएस 5 संस्करण (5 और 6 दोनों का समर्थन करने के लिए) को देखने के लिए सशर्त दोनों नोट करें और यदि इसे भेजा गया है तो व्यू कंट्रोलर को कॉल करने की आवश्यकता (उदाहरण के लिए, प्रमाणीकृत हैंडलर: प्रमाणित करने के लिए प्रत्यक्ष प्रतिस्थापन नहीं है WithCompletionHandler: - आपको कुछ अतिरिक्त काम करना है)।

-(void)authenticateLocalUser { 

    if (!self.checkingLocalPlayer) { 
     self.checkingLocalPlayer = YES; 
     GKLocalPlayer *thisPlayer = [GKLocalPlayer localPlayer]; 

     if (!thisPlayer.authenticated) { 

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

      if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) { 

       [thisPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) { 

        if (viewcontroller) { 
         [self.delegate presentViewController:viewcontroller]; 
        } else { 
         [self finishGameCenterAuthWithError:error]; 
        } 

       })]; 

      } else { 

       [[GKLocalPlayer localPlayer] 
       authenticateWithCompletionHandler:^(NSError *error) 
       { 
        [self finishGameCenterAuthWithError:error]; 
       } 
       ]; 
      } 

     } 
    } 
} 
presentViewController

:

-(void)presentViewController:(UIViewController *)thisVC { 

    [myTopVC presentModalViewController:thisVC animated:YES]; 

} 

दुर्भाग्य: समारोह बस (यह सब काम करने के लिए जो मैं अपने कार्यक्रम में हाथ से यह पता लगाने की थी) मेरी शीर्ष दृश्य नियंत्रक से नया दृश्य नियंत्रक कॉल , आईओएस 6 के रूप में, ऐसा लगता है कि GameCenter किसी उपयोगकर्ता को फिर से चालू करने का प्रयास नहीं करेगा अगर इसे पहले से ही चालू सत्र में रद्द कर दिया गया है, इसलिए कम से कम मेरे कुछ बिंदुओं को उचित होने पर पुनः प्राप्त करने का बिंदु समाप्त हो गया है। लेकिन, यह अभी भी आईओएस 5 के लिए है (और शायद अन्य स्थितियों को रद्द करने से?)।

यह उपयोगकर्ता को कुछ और करने के बाद ऐप को वापस नींद से वापस बुलाया जाने पर पुनः प्रयास करने का प्रयास करें।

+0

किसी भी कारण से आप यह जांचने के बजाय आईओएस संस्करण की जांच कर रहे हैं कि 'setAuthenticateHandler:' विधि उपलब्ध है या नहीं? मैं सोच रहा हूं कि यह आईओएस में अनियंत्रित हो सकता है <6 ... – megastep

+0

बस मुझे स्पष्ट लग रहा था। –

+1

ठीक है, जब तक कि बिल्कुल जरूरी नहीं है, ऐप्पल दृढ़ता से विशिष्ट आईओएस संस्करणों की जांच के बजाय चयनकर्ताओं और कक्षाओं की उपलब्धता की जांच करने की सिफारिश करता है। यदि आप कारण से याद दिलाना चाहते हैं तो आप हमेशा अपने कोड में एक टिप्पणी जोड़ सकते हैं ... – megastep

1

मेरे पास बिल्कुल वही समस्या थी और इसी तरह के क्रैश संदेश और उपर्युक्त उत्तरों ने समस्या का समाधान नहीं किया। (शून्य) authenticateLocalPlayer से - - (शून्य) viewDidLoad

2012-09-25 15:55:25.569 APP NAME [1493:907] * Terminating app due to uncaught exception 
'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from 
<GKModalRootViewController: 0x1cd8b2a0> to <GKHostedAuthenticateViewController: 0x1e31a350> 
while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know 
the current transition has completed' 

क्या वास्तव में मेरे लिए समस्या का कारण है कि मैं कहा जाता था। एक बार जब मैं कॉल (- शून्य) viewDidAppear को स्थानांतरित कर देता हूं, तो यह कॉलिंग के बहिष्कृत तरीके से भी सब कुछ तय करता है। (reference to this question)

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    //Setup Game Center Manager 
    if ([GameCenterManager isGameCenterAvailable]) { 
     delegate.gameCenterManager = [[GameCenterManager alloc] init]; 
     [delegate.gameCenterManager setDelegate:delegate]; 
     [delegate.gameCenterManager authenticateLocalUser]; 
    } else { 
     // The current device does not support Game Center. 
    } 

    //... more things if you have 
} 
+0

अपने कोड को पोस्ट करें marcwjj –

+0

अनुरोध के रूप में पोस्ट किया गया कोड। – marcwjj

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