重复游戏中心欢迎横幅

时间:2012-03-20 18:51:14

标签: ios5 game-center

如果您的应用程序每次从睡眠状态唤醒,您如何阻止游戏中心“欢迎回来”消息显示?一些应用程序(如Scramble CE,Jetpack Joyride和Bubblin)正确处理(启动时只有一条欢迎消息),而其他应用程序(如Backgammon NJ)则不会(每次设备唤醒时都欢迎消息)。

正在运行的块代码不再在我的控制之下(发送到authenticateWithCompletionHandler),即使块无论如何都会显示欢迎消息。

这种行为在iOS 5.0中开始发生(在4.x中很好),并且发生在模拟器和真实设备中,而不是沙盒中。

谢谢!

2 个答案:

答案 0 :(得分:1)

我来自BivisSoft。我们开发了Bubblin。

我们有一个控制GameCenter的Singleton。

这是我们的代码...... 它基于Jacob Gundersen的教程 - 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!");
        }
    }

答案 1 :(得分:0)

在Game Kit编程指南中,我找到了一些文档:

  

所有支持Game Center的游戏都必须验证本地播放器   在使用Game Center的任何功能之前。你的游戏应该   启动后尽早验证播放器。理想的情况下,   只要您的游戏能够呈现用户,就应该进行身份验证   与播放器的接口。当您的游戏验证玩家时,游戏   套件首先检查是否已经过验证   设备上的播放器。 如果有经过身份验证的播放器,Game Kit   向玩家简要显示欢迎横幅。

似乎您不能使用公共API更改此行为。