2015-12-24 7 views
5

नहीं कहा जाता है यह लगभग GameCenter है।Gamecenter ios 9 GameCenter GKLocalPlayerListener विधियों को

के बाद से "GKLocalPlayerListener प्रोटोकॉल GKChallengeListener, GKInviteEventListener, और GKTurnBasedEventListener से तरीकों विरासत

कई घटनाओं को संभालने के लिए आदेश में।" और "GKChallengeListener, GKInviteEventListener, और GKTurnBasedEventListener को लागू नहीं करते सीधे;। बजाय GKLocalPlayerListener लागू

आप GKLocalPlayerListener का उपयोग करके कई घटनाओं को सुन सकते हैं और संभाल सकते हैं "(ये सेब डॉक्स से हैं)।

एक यह है कि उम्मीद करेंगे GKLocalPlayer.localPlayer() के बाद GKLocalPlayerListener दर्ज की प्रमाणीकृत किया गया है के बाद, तो GKLocalPlayerListener में सभी तरीकों कहा जा सकता है, जब उचित घटनाओं होती हैं।

हालांकि, अलग से "खिलाड़ी (खिलाड़ी: GKPlayer, receivedTurnEventForMatch मैच: GKTurnBasedMatch, didBecomeActive: बूल)" है, जो कहा जाता है, जिनमें शामिल हैं "खिलाड़ी (खिलाड़ी: GKPlayer, matchEnded मैच: GKTurnBasedMatch)" सभी अन्य तरीकों, है ऐसा कोई घटना नहीं होने पर कभी नहीं कहा जाता है।

क्या हमें कुछ अन्य श्रोता पंजीकृत करने की आवश्यकता है या क्या मुझे कुछ याद आ रही है?

+1

मैं TurnBasedSkeleton बनाया (https://github.com/mhatzitaskos/TurnBasedSkeleton)। इस प्रोजेक्ट का उद्देश्य GameCenter का उपयोग करके किसी भी बारी आधारित गेम के लिए कंकाल बनाना है। चूंकि गेम सेंटर में प्रलेखन और ट्यूटोरियल में कमी आती है, खासतौर पर जहां तक ​​बारी आधारित गेमिंग का संबंध है, मैंने इस परियोजना को उन लोगों की मदद करने का फैसला किया जो गेमसेन्टर को अपनी परियोजनाओं में एकीकृत करना चाहते हैं। किसी भी मदद की सराहना की जाएगी। मुख्य अनसुलझा मुद्दा यह है कि एक खिलाड़ी जो आमंत्रण प्राप्त करता है उसे अधिसूचित किया जा सकता है। इसके लिए कोई स्वचालित अधिसूचना प्रतीत नहीं होती है। –

+0

निमंत्रण अधिसूचना समस्या को हल करने के लिए प्रबंधित किया गया। TurnBasedSkeleton प्रोजेक्ट को अद्यतन कर दिया गया है। –

उत्तर

6

यह पता लगाने के संबंध में कि आपको बारी आधारित मिलान में आमंत्रित किया गया है: कोई ईवेंट नहीं भेजा जाता है, लेकिन जब आप सर्वर से मैचों की अपनी सूची पूछते हैं, तो आपके पास अचानक एक नया मैच दिखाई देगा (और आपकी स्थिति होगी आमंत्रित)। (प्राप्तकर्ता, एक UIAlert शीघ्र कि वे एक आमंत्रण प्राप्त हो गया है प्राप्त करता है, हालांकि)

यदि/जब विभिन्न एपीआई कार्यों आग, मैं कई, कई, खर्च किया है के बारे में कई घंटे समझने की कोशिश कर रहा जब ये विभिन्न कार्य आग लगती हैं। मैंने या तो कार्यों के खिलाफ या दस्तावेज़ीकरण के खिलाफ कुछ कीड़े से अधिक खोला है। यहां मेरे वर्तमान नोट्स हैं; इस तरह मैंने अपने सहायक वर्ग में सभी प्रतिनिधि कार्यों का आयोजन किया है, यह दर्शाता है कि वे किस श्रोता के साथ-साथ नोट्स पर भी लागू होते हैं कि उन्हें क्या आग लगती है।

आप देख सकते हैं कि कई ऐसे हैं जिन्हें मैंने कभी नहीं समझा है। इस सूची में कोई अतिरिक्त इनपुट/स्पष्टीकरण की सराहना की जाएगी।

#pragma mark - specific to real-time matches 
//this is for real-time matches only (but the docs don't say that) 
-(void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite 



#pragma mark - saved game listener (GKSavedGameListener) 
//never fires. Theory: only fires if the SAME player tries to save the game from a different device while being the active player 
-(void)player:(GKPlayer *)player didModifySavedGame:(GKSavedGame *)savedGame 

//never fires. Theory: only fires if the SAME player tries to save the game from a different device while being the active player 
-(void)player:(GKPlayer *)player hasConflictingSavedGames:(NSArray *)savedGames 



#pragma mark - game launched via game center (GKLocalPlayerListener) 
//DEPRECATED: This is fired when the user asks to play with a friend from the game center.app 
-(void)player:(GKPlayer *)player didRequestMatchWithPlayers:(NSArray *)playerIDsToInvite 

//This is fired when the user launches the game from Game Center and requests to play with a friend 
-(void)player:(GKPlayer *)player didRequestMatchWithRecipients:(NSArray *)recipientPlayers 

//Never seen this fire. Possibly fired when the user launches the game from Game Center. Unclear how this varies from didRequestMatchWithRecipients 
-(void)player:(GKPlayer *)player didRequestMatchWithOtherPlayers:(NSArray *)playersToInvite 



#pragma mark - Ending turn based matches (GKLocalPlayerListener) 
//I've never seen this fire 
-(void)player:(GKPlayer *)player matchEnded:(GKTurnBasedMatch *)match 

//I've never seen this fire 
-(void)player:(GKPlayer *)player wantsToQuitMatch:(nonnull GKTurnBasedMatch *)match 



#pragma mark - challenges (GKLocalPlayerListener) 
//untested, I don't use challenges 
-(void)player:(GKPlayer *)player issuedChallengeWasCompleted:(GKChallenge *)challenge byFriend:(GKPlayer *)friendPlayer 

//untested, I don't use challenges 
-(void)player:(GKPlayer *)player didCompleteChallenge:(GKChallenge *)challenge issuedByFriend:(GKPlayer *)friendPlayer 

//untested, I don't use challenges 
-(void)player:(GKPlayer *)player didReceiveChallenge:(GKChallenge *)challenge 

//untested, I don't use challenges 
-(void)player:(GKPlayer *)player wantsToPlayChallenge:(GKChallenge *)challenge 



#pragma mark - exchanges (GKLocalPlayerListener) 
//seems to work as expected 
-(void)player:(GKPlayer *)player receivedExchangeCancellation:(GKTurnBasedExchange *)exchange forMatch:(GKTurnBasedMatch *)match 

//this fires for the Current Player AND the Exchange Initiator AFTER all replies/timeouts are complete. 
-(void)player:(GKPlayer *)player receivedExchangeReplies:(NSArray *)replies forCompletedExchange:(GKTurnBasedExchange *)exchange forMatch:(GKTurnBasedMatch *)match 

//seems to work as expected 
-(void)player:(GKPlayer *)player receivedExchangeRequest:(GKTurnBasedExchange *)exchange forMatch:(GKTurnBasedMatch *)match 



#pragma mark - event handler (GKLocalPlayerListener) 
-(void)player:(GKPlayer *)player receivedTurnEventForMatch:(GKTurnBasedMatch *)match didBecomeActive:(BOOL)didBecomeActive 
/* 
    Apple says this fires when: 
    1. When it becomes the active player's turn, including the inviting player creating a new match (CHECK) 
    2. When the time out is about to fire (FAIL. It fires AFTER the timeout expires, which may just be item #4 happening) 
    3. Player accepts an invite from another player (FAIL. Never happens. Instead it fires when an INVITED player starts playing a session FROM this player.) 
    4. Turn was passed to another player. (CHECK) 
    5. player receives a reminder (CHECK, confirmed by μ4ρκ05) 

    It Also fires when: 
    6. A remote user quits (CHECK) 
    7. A remote user declines (unconfirmed) 
    8. An automatch player joins the game (CHECK) 
    9. An invited player starts playing (CHECK) 
    10. A remote user saves the game (CHECK) 
*/ 

संपादित करें: μ4ρκ05 की प्रतिक्रिया के आधार पर "अनुस्मारक" अधिसूचना की स्थिति अपडेट।

1

ठीक है, विभिन्न तरीकों की आपकी सूची और स्पष्टीकरण ने मुझे सोच लिया। सबसे पहले। एक मैच प्राप्त होने पर कोई अधिसूचना प्राप्त करने की समस्या मेरे लिए सबसे दिक्कत वाली समस्याओं में से एक है क्योंकि अगर आपको अधिसूचित नहीं किया जाता है तो इसका मतलब है कि आपको डेटा खींचने की आवश्यकता होगी। तो, आप फिर से मैच कब लोड करते हैं? गेम की सूची के साथ प्रत्येक एक्स सेकंड या हर बार दृश्य नियंत्रक प्रकट होता है? दोनों अनावश्यक नेटवर्क कॉल जारी करेंगे जो परेशान होंगे और चूंकि किसी भी वास्तविक परिवर्तन के बिना गेम की सूची को पुनः लोड करने की आवश्यकता हो सकती है, इसलिए यह भी अच्छा नहीं लग सकता है। तो सबसे पहले मैं एक्सचेंजों का उपयोग करने की सोच रहा था ताकि प्रतिद्वंद्वी को अधिसूचित किया जा सके और गेम को फिर से लोड किया जा सके। हालांकि, आपकी पोस्ट पढ़ने के बारे में मुझे player receives a reminder (UNTESTED) याद आया जिसे receivedTurnEventForMatch कहा जाता है। अब, मैं प्रतिद्वंद्वी को नया गेम शुरू करने, एक मोड़ लेने और फिर एक अनुस्मारक भेजकर नए गेम की अधिसूचना प्राप्त करने में कामयाब रहा।

मैंने अपना TurnBasedSkeleton प्रोजेक्ट अपडेट किया है।

+0

मैंने मूल रूप से आपके द्वारा वर्णित किया है, मेरे पास गेम प्रबंधित करने और प्रतीक्षा गेम के लिए बैज प्रदर्शित करने के लिए एक विशिष्ट वीसी है, और मैं डेटा को दो विशिष्ट परिस्थितियों में खींचता हूं। मैंने पाया कि मुझे अन्य गेम सेंटर सीमाओं के कारण सर्वर पर इतने सारे (आईएमओ) बाहरी पढ़ने/लिखना है, कि यह बाल्टी में सिर्फ एक बूंद थी। मुझे अनुस्मारक का उपयोग करने का आपका विचार पसंद है, हालांकि, और उसके साथ भी खेलेंगे। मैं यह इंगित करने के लिए अपनी पोस्ट अपडेट करूंगा कि अनुस्मारक की पुष्टि की गई है। – Thunk

0

मेरे पास थंक्स के उत्तर पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है लेकिन मैं अपना खुद का सबमिट कर सकता हूं, इसलिए मैं इसे बाहर निकाल दूंगा। समस्या का सबसे बड़ा हिस्सा यह है कि इस कोड का उपयोग करने के तरीके के बारे में कोई उदाहरण नहीं है और दस्तावेज़ीकरण की कमी है। तो, कोड फायरिंग नहीं है यह प्रमाण प्रमाणित नहीं है कि कोड टूटा हुआ है, बस हम नहीं जानते कि इसका उपयोग कैसे किया जाए।

लेकिन बंक बना रहा है कि बयान के आधार पर मैं खिलाड़ी प्राप्त करने में सक्षम था: didModifySavedGame और खिलाड़ी: क्या है, वह कहता है कि उसने कभी उन्हें आग नहीं देखा है।

ये GKSavedGameListener पागलपन के लिए विधियां हैं। इस प्रोटोकॉल के साथ मेरी समस्या यह थी कि इसमें असाइन करने के लिए कोई प्रतिनिधि नहीं है, इसलिए मैं अपने कार्यक्रम में किसी भी वर्ग को चुन सकता हूं और इसे इस प्रोटोकॉल के अनुरूप बना सकता हूं और फिर विधियों को आग लगने की उम्मीद करता हूं, जो असंभव प्रतीत होता है। तो मुझे यह कहने के लिए कि किस वर्ग ने समझाया था, एक प्रतिनिधि को कुछ प्रकार की जरूरत थी।

मैंने पाया कि स्थानीय प्लेयर.रेस्टर लिस्टर (स्वयं) को स्थापित करके जहां स्वयं अनुरूप वर्ग है, मैं उन्हें आग लगाना चाहता हूं।

तो इस सेट के साथ फायरिंग नहीं कर रहे किसी भी तरीके की जांच करें और यह बताएं कि यह बेहतर काम करता है या नहीं।

+0

सोजोरनर, वास्तव में फ़ंक्शनिंग में कौन सी घटना का परिणाम होता है? क्या यह सर्वर को मैच में सहेज रहा है? मेरे पास मेरे हेडर में 'GKSavedGameListener' है, और मैं स्थानीय प्लेयर्स के' रजिस्टर लिस्टनर 'का उपयोग करता हूं (जो' प्राप्त टर्नएवेंट 'आग बनाने के लिए पहले से ही आवश्यक था), लेकिन मैंने अभी भी उन दो कार्यों में ब्रेकपॉइंट्स कभी नहीं मारा है। इसलिए, मैं अभी भी उलझन में हूं कि उन्हें क्या आग लगती है। – Thunk

+0

ऐडडिलेगेट में फ़ंक्शन कॉल से, GKLocalPlayer संदर्भ में दिखाए गए अनुसार स्थानीय प्लेयवर प्रमाणीकृत करें: applicationDidBecomeActive। तीसरे भाग में localPlayer.registerListener (self) और localPlayer.fetchSavedGamesWithCompletionHandler जोड़ें। एक्सटेंशन जोड़ें MyClassName: GKSavedGameListener और GKSavedGameListener से दो फ़ंक्शंस को कार्यान्वित करें। स्थानीय प्लेयर्स को कॉल करते समय।saveGameData (completHandler :) एक डिवाइस प्लेयर पर: DidModifySaveGame को 20 सेकंड में आग लगनी चाहिए। मैं यह सब तेज़ी से कर रहा हूं इसलिए मेरे पास कोई हेडर नहीं है। – Sojourner9

0

आप कुछ भी याद नहीं कर रहे हैं। एप्पल

निकालें [इन] सुविधा [एस]

मैं आगे की जांच करके एप्पल के साथ एक प्रस्तुत एक बग खोला करने के लिए चुना गया है। उनकी प्रतिक्रिया कम से कम कहने के लिए संतोषजनक थी।

Apple bug report

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