Повторный игровой центр Приветственные баннеры - PullRequest
2 голосов
/ 20 марта 2012

Как предотвратить отображение сообщения «Добро пожаловать» в Game Center при каждом пробуждении вашего приложения? Некоторые приложения (например, Scramble CE, Jetpack Joyride и Bubblin) обрабатывают его правильно (только одно приветственное сообщение при запуске), в то время как другие (например, Backgammon NJ) этого не делают (приветственное сообщение при каждом пробуждении устройства).

Код блока, который выполняется, больше не находится под моим контролем (отправляется в authenticateWithCompletionHandler), и сообщение приветствия появляется, даже если блок в любом случае пуст.

Такое поведение начало происходить с iOS 5.0 (было хорошо в 4.x), и происходит как на симуляторе, так и на реальных устройствах, в Песочнице и нет.

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 апреля 2012

Я из БивисСофт. Мы разработали Bubblin.

У нас есть Singleton, который контролирует GameCenter.

Вот наш код ... Он основан на учебнике Якоба Гундерсена - http://www.raywenderlich.com/5480/beginning-turn-based-gaming-with-ios-5-part-1.

Вы можете попробовать!

    #pragma mark Singleton

    static BSGameCenterManager *sharedHelper = nil;
    + (BSGameCenterManager *) sharedInstance {
        if (!sharedHelper) {
            sharedHelper = [[BSGameCenterManager alloc] init];
        }
        return sharedHelper;
    }

    #pragma mark Initializers

    - (id)init {
        if ((self = [super init])) {
            gameCenterAvailable = [self isGameCenterAvailable];
            if (gameCenterAvailable) {
                self.localPlayerId = @"";
                NSNotificationCenter *nc = 
                [NSNotificationCenter defaultCenter];
                [nc addObserver:self 
                       selector:@selector(authenticationChanged) 
                           name:GKPlayerAuthenticationDidChangeNotificationName 
                         object:nil];
            }
        }
        return self;
    }

    // Check if GameCenter is Avaiable 
    - (BOOL)isGameCenterAvailable {
        // check for presence of GKLocalPlayer API
        Class gcClass = (NSClassFromString(@"GKLocalPlayer"));

        // check if the device is running iOS 4.1 or later
        NSString *reqSysVer = @"4.1";
        NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
        BOOL osVersionSupported = ([currSysVer compare:reqSysVer     
                                               options:NSNumericSearch] != NSOrderedAscending);

        return (gcClass && osVersionSupported);
    }

    #pragma mark Authentication

    - (void)authenticationChanged {    

        if ([GKLocalPlayer localPlayer].isAuthenticated && 
            !self.userAuthenticated) {
            NSLog(@"GameCenter authentication changed: player authenticated.");
            self.userAuthenticated = TRUE;           
            self.localPlayerId = [[GKLocalPlayer localPlayer] playerID];
            [[NSNotificationCenter defaultCenter] postNotificationName: @"gameCenterPlayerAuthenticated" object: nil userInfo: nil];    
            [self checkNotSentScores];
        } else if (![GKLocalPlayer localPlayer].isAuthenticated && 
                   self.userAuthenticated) {
            NSLog(@"GameCenter authentication changed: player not authenticated");
            self.userAuthenticated = FALSE;
            self.localPlayerId = @"";
        }
    }

    - (void)authenticateLocalUser { 

        if (!gameCenterAvailable) return;

        NSLog(@"GameCenter authenticating local user...");
        if ([GKLocalPlayer localPlayer].authenticated == NO) {     
            [[GKLocalPlayer localPlayer] 
             authenticateWithCompletionHandler:nil];        
        } else {
            NSLog(@"GameCenter already authenticated!");
        }
    }
0 голосов
/ 20 марта 2012

В руководстве по программированию Game Kit я нашел этот фрагмент документации:

Все игры, которые поддерживают Game Center, должны аутентифицировать локального игрока, прежде чем использовать какие-либо функции Game Center.Ваша игра должна аутентифицировать игрока как можно раньше после запуска.В идеале аутентификация должна происходить, как только ваша игра может представить игроку интерфейс пользователя.Когда ваша игра аутентифицирует игрока, Game Kit сначала проверяет, есть ли на устройстве уже аутентифицированный игрок. Если есть авторизованный игрок, Game Kit кратко отображает приветственный баннер для игрока.

Не похоже, что вы можете изменить это поведение с помощью общедоступных API.

...