Small side-note first, Vizati is now available for the Super Nintendo, more info.

For my third idevblogaday post I’m going to talk about Game Center.
Game Center was released only a couple months ago (September or so) but already tons of applications are using it and even more, players ask for it.

It’s a way to track achievements, leader boards etc. Unfortunately It’s only available from iOS 4.1+, so some compatibility check has to be done.

Let’s start by checking if the device is able to use Game Center

- (BOOL)isGameCenterAvailable
    // Check for presence of GKLocalPlayer API.	
    Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
    // The device must be running running iOS 4.1 or later.	
    NSString *reqSysVer = @"4.1";
    // Get Current sys version	
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];	
    // Compare both versions
    BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);	
    // Final Check
    return (gcClass && osVersionSupported);

Now we can use it to check if it’s available before actually using it. I would advise you to make this check only once at start and store it somewhere. Using this function intensively is not recommended.

So to init Game Center:

- (void)initGameCenter {
	// Only continue if Game Center is available on this device
	if ([self isGameCenterAvailable])
		// Authenticate the local player
		[self gameCenterAuthenticate];
		// Register the GKPlayerAuthenticationDidChangeNotificationName notification
		NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
		[nc addObserver: self

Noticed the gameCenterAuthenticate and gameCenterAuthenticationChanged we registered?

First our registered function will check if the player has logged in, if not it will prompt it.

- (void)gameCenterAuthenticate {
	// Authenticate the local user
	if([GKLocalPlayer localPlayer].authenticated == NO) 
		[[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) 
			if(error == nil) 
				// Game Center Active and Player Sucessfully logged in
                                // Store in your global vars that Game Center is Active
				// Player Is not Logged In, so proceed as not having Game Center
                                // Store in your global vars that Game Center is INACTIVE

- (void)gameCenterAuthenticationChanged {
    [self gameCenterAuthenticate]; // In case the player makes logout we prompt it with login again.

To submit something to Game Center:

         std::string category = "top_score"; // Identifier you registered for your App with Apple, check iTunesConnect
         int value = 1000; // Let's say your player made 1000 points

         NSString *cat = [[NSString alloc] initWithUTF8String:category.c_str()];
	// Report the high score to Game Center
	GKScore *scoreReporter = [[[GKScore alloc] initWithCategory:cat] autorelease];
	scoreReporter.value = value;
	[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
		if (error == nil) {
			NSLog(@"Game Center - High score successfully sent");

And that’s it. There’s tons of other stuff like achievements, online playing etc. But this should get you started.