2015-12-24 30 views
5

To jest około GameCenter.Gamecenter ios 9 GameCenter GKLocalPlayerListener metody nie nazywane

Ponieważ "protokół GKLocalPlayerListener dziedziczy metody z GKChallengeListener, GKInviteEventListener i GKTurnBasedEventListener

Aby obsługiwać wiele zdarzeń." I „nie realizować GKChallengeListener, GKInviteEventListener i GKTurnBasedEventListener bezpośrednio;. Wdrożenia GKLocalPlayerListener zamiast

Możesz słuchać i obsługiwać wiele zdarzeń za pomocą GKLocalPlayerListener "(są to dokumenty z Apple Docs).

Można się spodziewać, że po zarejestrowaniu GKLocalPlayerListener po uwierzytelnieniu GKLocalPlayer.localPlayer(), wszystkie metody w GKLocalPlayerListener będą wywoływane, gdy wystąpią odpowiednie zdarzenia.

Jednak oprócz "gracza (gracz: GKPlayer, mecz receivedTurnEventForMatch: GKTurnBasedMatch, didBecomeActive: Bool)", który nazywa się wszystkie inne metody, w tym "zawodnika (zawodnik: GKPlayer, mecz matchEnded: GKTurnBasedMatch)" jest nigdy nie jest wywoływany, gdy wystąpi takie zdarzenie.

Czy musimy zarejestrować innego słuchacza, czy jest coś, czego mi brakuje?

+1

stworzyłem TurnBasedSkeleton (https://github.com/mhatzitaskos/TurnBasedSkeleton). Ten projekt ma na celu stworzenie szkieletu do każdej turowej gry za pomocą GameCenter. Ponieważ GameCenter wydaje się brakować dokumentacji i samouczków, szczególnie jeśli chodzi o turowe gry, postanowiłem stworzyć ten projekt, aby pomóc innym, którzy mogą chcieć zintegrować GameCenter z ich projektami. Każda pomoc zostanie doceniona. Głównym nierozwiązanym problemem jest to, w jaki sposób gracz otrzymujący zaproszenie może otrzymać powiadomienie. Wydaje się, że nie ma tam żadnego automatycznego powiadomienia. –

+0

Zarządzane w celu rozwiązania problemu z powiadomieniem o zaproszeniu. Projekt TurnBasedSkeleton został zaktualizowany. –

Odpowiedz

6

Jeśli chodzi o wykrywanie, że ktoś Cię zaprosił na mecz oparty na teście: żadne zdarzenie nie jest wysyłane, ale kiedy przesyłasz zapytanie o listę meczów z serwera, po prostu pojawia się nowy mecz (i twój status zostanie wyświetlony) zaproszony). (Odbiorca ma otrzymać monit UIAlert że otrzymasz zaproszenie, choć)

Odnośnie jeśli/kiedy różne funkcje API ogień, spędziłem wiele, wiele, wiele godziny próbując rozszyfrować kiedy te różne funkcje się uruchamiają. Otworzyłem więcej niż kilka błędów przeciwko funkcjom lub przeciwko dokumentacji. Oto moje bieżące notatki; W ten sposób uporządkowałem wszystkie funkcje delegatów w mojej klasie pomocnika, wskazując, do którego słuchacza się zwracają, oraz notatki, co powoduje, że strzelają.

Widać, że jest kilka takich, których nigdy nie odszyfrowałem. Wszelkie dodatkowe dane wejściowe/wyjaśnienia na tej liście byłyby bardzo mile widziane.

#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) 
*/ 

Edytuj: zaktualizowano status powiadomień "przypomnienia" na podstawie opinii użytkownika μ4ρκ05.

1

OK, twoja lista i wyjaśnienie różnych metod sprawiło, że pomyślałem. Przede wszystkim. Problem polegający na braku powiadomienia o pojedynku jest jednym z najbardziej palących problemów, ponieważ jeśli nie otrzymasz powiadomienia, będziesz musiał pobrać dane. Kiedy ponownie ładujesz mecze? Co X sekund lub za każdym razem, gdy pojawia się kontroler widoku z listą gier? Oba będą wydawały niepotrzebne połączenia sieciowe, które będą irytujące, a także dlatego, że lista gier może wymagać ponownego załadowania, bez żadnej faktycznej zmiany, może też nie wyglądać dobrze. Tak więc na początku myślałem o korzystaniu z giełd, aby przeciwnik mógł otrzymywać powiadomienia i przeładowywać gry. Jednak czytając swój wpis pamiętałem o player receives a reminder (UNTESTED), który nazywał się receivedTurnEventForMatch. Teraz udało mi się powiadomić przeciwnika o nowej grze, inicjując nową grę, wykonując turę, a następnie wysyłając przypomnienie.

Zaktualizowałem mój projekt TurnBasedSkeleton.

+0

Zrobiłem w zasadzie to, co opisałeś, mam specyficzny VC do zarządzania grami i wyświetlania znaczników do gier oczekujących, a ja wyciągam dane w dwóch specyficznych okolicznościach. Zauważyłem, że muszę zrobić tak wiele (IMO) nieczytelnych odczytów/zapisów na serwerze z powodu innych ograniczeń centrum gier, że to był tylko spadek w kubełku. Podoba mi się twój pomysł wykorzystania przypomnienia, ale też będziesz z nim grać. Zaktualizuję mój wpis, aby wskazać, że przypomnienia są potwierdzone. – Thunk

0

Nie mam reputacji wystarczająco wysokiej, aby komentować odpowiedź Thunków, ale mogę przesłać własną, więc w ten sposób dowiem się o tym. Największy problem polega na tym, że nie ma przykładów użycia tego kodu i brakuje dokumentacji. Tak więc, kod nie wystrzeliwujący nie jest dowodem na to, że kod jest uszkodzony, tylko że nie wiemy, jak go użyć.

Ale na podstawie stwierdzeń, które robi Thunk, udało mi się zdobyć gracza: didModifySavedGame i player: hasConflictingSavedGames, który mówi, że nigdy nie widział, jak strzelają.

Oto metody szaleństwa GKSavedGameListener. Problem z tym protokołem polegał na tym, że nie ma delegata, który mógłby go przypisać, więc mogę wybrać dowolną klasę w moim programie i dostosować ją do tego protokołu, a następnie oczekiwać, że metody zostaną uruchomione, co wydawało się mało prawdopodobne. Potrzebowałem więc jakiegoś delegata, żeby powiedzieć, która klasa się zgadza.

Znalazłem, że ustawiając localPlayer.registerListener (self), gdzie self jest klasą zgodną, ​​uruchamiam je na ogień.

Więc sprawdź dokładnie, jakie metody nie są uruchamiane z tym zestawem i daj nam znać, czy działa lepiej.

+0

Sojourner, jakie zdarzenie faktycznie powoduje wypalanie funkcji? Czy to zapisanie meczu na serwerze? W nagłówku mam 'GKSavedGameListener' i używam' registerListener' localPlayer (co było już konieczne do uruchomienia firewalla "receivedTurnEvent"), ale wciąż nigdy nie dostałem breakpointów w tych dwóch funkcjach. Tak więc wciąż jestem zdezorientowany tym, co powoduje, że strzelają. – Thunk

+0

Uwierzytelnij LocalPlayer, jak pokazano w GKLocalPlayer Reference, z wywołania funkcji w appDelegate: applicationDidBecomeActive. W trzeciej części dodaj localPlayer.registerListener (self) i localPlayer.fetchSavedGamesWithCompletionHandler. Dodaj rozszerzenie YourClassName: GKSavedGameListener i implementuj dwie funkcje z GKSavedGameListener. Podczas wywoływania localPlayer.saveGameData (completionHandler :) na jednym urządzeniu player: DidModifySaveGame powinien wystrzelić w 20 sekund. Robię to wszystko szybko, więc nie mam nagłówka. – Sojourner9

0

Nie brakuje niczego. Apple zdecydował się

Usuń [te] funkcji [s]

otworzyłem przekazany błąd z Apple, aby zbadać sprawę. Ich odpowiedź była co najmniej niezadowalająca.

Apple bug report