2010-11-30 11 views
11

W grze Zajmuję użyciu GameCenter chcę obsłużyć następujący scenariusz:GameCenter logowanie alert

  1. użytkownik uruchamia grę. Wyświetlany jest alarm systemowy, który monituje go o zalogowanie się do GameCenter. Na razie to ignoruje.
  2. po chwili użytkownik chce się zalogować do GameCenter i klika na (na przykład) pozycję menu Liderów. Na razie wybiera opcję anulowania zamiast logowania.
  3. proces powtarza się kilka razy. W końcu użytkownik chce zalogować się do GameCenter. Klika element menu Tabeli Leaderboard jeszcze raz.

W moich testów, znalazłem, że alert popup podniesiony przez wywołanie „authenticateWithCompletionHandler” (jak wywoływana przez przykładowy GameCenterManager Apple), co sugeruje, aby zalogować się do GameCenter pojawia się tylko ograniczoną ilość razy (4 lub 5). Ostatnim razem, gdy się pojawi, jest napisane: "Game Center Disabled, zaloguj się za pomocą aplikacji Game Center, aby włączyć funkcję" Afterwards ".Następnie, wywołanie authenticateWithCompletionHandler nie powoduje już niczego widocznego - nie pytaj w ogóle:

Grając FruitNinja próbowałem Jednak w ich przypadku wyskakujące okienko z napisem "Game Center Disabled" pojawia się za każdym razem, gdy kliknę element GameCenter (np. Osiągnięcia)

Chciałbym powielić funkcję : to znaczy, jeśli nie jesteś zalogowany w GameCenter, aby standardowy alert centrum gier pojawiał się za każdym razem, gdy klikniesz na pozycję w menu tabeli liderów:

Czy istnieje wa y, aby dowiedzieć się, czy pojawił się standardowy komunikat "Zaloguj się do centrum gier", czy też wymusić jego wyświetlenie przez cały czas (a nie tylko na pierwszych kilku próbach)?

+1

Czy kiedykolwiek byłeś w stanie to rozgryźć? –

Odpowiedz

3

To zachowanie jest skutkiem, po N nieudanych próbach - wyłączenia GameCenter dla aplikacji. Ponowne uruchomienie aplikacji lub zalogowanie się w samym centrum rozrywki spowoduje powrót do trybu online.

Zapomniałem, który dokument to przeczytałem, ale jest tam dokument Apple'a, który wyjaśnia to zachowanie.

+0

Ponowne uruchomienie aplikacji nie rozwiązało problemu. I jak stwierdził PO, inna aplikacja, FruitNinja, wydaje się używać API do wykrywania tego stanu. –

+3

Nie sądzę, że FruitNinja używa API. W moich obserwacji tego, co robią, jest następujące: kiedy widzą błąd z Kodeksem 2 z GameCenter („Żądana operacja została anulowana.”) Są ustawienie flagi mówiąc „gameCenterDisabled”. Następnym razem ** ** użytkownik próbuje uzyskać dostęp do funkcji GameCenter, są wyświetlając alert – thumbsup

+0

FYI, na iOS7 raz Game Center została wyłączona dla aplikacji, logując się za pomocą aplikacji Game Center nie rozwiąże problemu. Zobacz http://stackoverflow.com/questions/19013328/unable-to-sign-in-sandbox-gamecenter-on-ios-7/19013501#19013501 – Greg

1

Sam się teraz bawię z Game Center Widziałem to samo zachowanie. W dokumentacji nic nie mówi nic o tym, że okno dialogowe pojawia się tylko kilka razy. W moim przypadku chciałbym wcześniej ustalić, czy użytkownik jest już zalogowany w Game Center, aby móc odpowiednio się zachowywać. Ale teraz nie mogę tego wiedzieć, zanim okno zostanie wyświetlone użytkownikowi.

Ponieważ pracujemy w piaskownicy podczas programowania, zachowanie to może być oczywiście czymś, co zachowuje się inaczej podczas produkcji, ale nie jest to łatwe do odkrycia.

8

Oto jest pomysł, aby obejść ten problem:

Bez względu na to, czy "GC authenticateWithCompletionHandler" -request zostanie anulowane

  • przez użytkownika tapping "Anuluj" w oknie

lub ze względu na fakt, że

  • GC wyłączono d evice (co zdarza się, gdy użytkownik anulował powiadomienie-dialog dokładnie 3 razy (w iOS 5 przynajmniej))

zawsze będziesz otrzymywać NSError z kodem 2 powiedzenie „Żądana operacja została anulowana.”.

Jedynym wyróżnikiem, jaki mogłem znaleźć, jest czas upływający między żądaniem uwierzytelnieniaWithCompletionHandler a wykonaniem instrukcji obsługi zakończenia.

więc podczas wysyłania żądania jestem oszczędność czasu:

requestTime = [NSDate date]; 

iw moim obsługi realizacji i mierzyć czas wygasły:

NSDate* now = [NSDate date]; 
CFTimeInterval elapsedTimeSinceAuthenticationRequest = [now timeIntervalSinceDate:requestTime]; 
NSLog(@"time Elapsed: %f", elapsedTimeSinceAuthenticationRequest); 

Jeśli użytkownik anulował żądanie, czas przeszły będzie znacznie dłuższy w porównaniu do czasu, który upłynął, jeśli GC anuluje operację. W moich testach zajęło użytkownikowi co najmniej jedną sekundę, aby anulować okno dialogowe, podczas gdy żądanie anulowane GC zajęło mniej niż 0,1 sekundy (na moim iPhone 4)

Oczywiście te wartości mogą się różnić w zależności od urządzenia kod działa i na czym jeszcze procesor jest zajęty. Jedną z pułapek, którą już zbadałem, jest uruchomienie aplikacji: Jeśli wysyłasz żądanie uwierzytelnienia podczas applicationDidFinishLaunching zgodnie z sugestią firmy Apple, GC anulowało żądanie w moim przypadku, ponieważ urządzenie jest zajęty ładowaniem widoków i wszystkiego, co jest konieczne do uruchomienia Aplikacja.

Więc daj mi znać, jeśli próbował tego rozwiązania, a jeśli to działa dla Ciebie, jak będę kiedyś zrobiłem dalszych badań ...

+0

To jest jedyne rozwiązanie; nie tylko stwierdzenie "faktów". – junkdog

3

Nie mogłem znaleźć dobrej odpowiedzi również, więc postanowiłem po prostu replikować wiadomość, gdy zacznę otrzymywać błąd anulowania. Nadal jest w fazie rozwoju, ale zasadniczo zmienia wywołanie zwrotne przycisku, aby wyświetlić komunikat o błędzie, a nie wyświetlać planszę wiodącą.

Tylko notatkę, nie jestem pewien, czy to będzie zatwierdzone, czy nie, ponieważ replikuję komunikat o błędzie Apple.

-(void) gcLogin: (id) sender { 
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) { 
     if(error) { 
      if([[error domain] isEqualToString:GKErrorDomain] && [error code] == GKErrorCancelled) { 
       [ResourceManager showAlertWithTitle:@"GameCenter Disabled" message:@"Sign in with Game Center application to enable"]; 
       mGameCenterCancelled = YES; 
      } 
      NSLog(@"%@", [error description]); 
     } else { 
      [self updateMenu]; 
      mGameCenterCancelled = NO; 
     } 
    }]; 
} 
0

Mam do czynienia z tym samym problemem.Chociaż nie udało mi się znaleźć sposobu na wyskoczenie z tego samego okna dialogowego do logowania do Game Center, znalazłem sposób, aby zaimplementować komunikat ostrzegawczy "Gamecenter jest wyłączony", gdy użytkownik kliknie ikonę tabeli liderów:

if ([GKLocalPlayer localPlayer] .authenticated == NO)
{
// Monit alert komunikat ostrzegawczy mówiący game Center jest wyłączona
}
inny
{
// postępować z otworem Leaderboard
}

Mam nadzieję, że to pomoże!

0

Wydaje się, że iOS spowoduje wyłączenie Game Center i całkowicie uniemożliwić monitowanie, gdy użytkownik zdecyduje się wyłączyć Game Center (opcja pojawi się na piątym 5th Game Center anulować wejść).

Aby przywrócić urządzenie do pierwotnego stanu, w którym ponownie pojawi się okno logowania. Po prostu zaloguj się za pomocą aplikacji Game Center przy użyciu normalnego działającego konta Game Center (nie tester). Kiedy już się znajdziesz, wyloguj się. Powinien zacząć monitować ponownie w aplikacji.