IOS 7排行榜游戏中心

我已经成功地将Game Centerfunction添加到我的应用程序。 当应用程序打开它成功validation用户,并显示“欢迎回(用户名)”的旗帜。

不过,我不确定如何在游戏中添加排行榜。 我想知道如果有人可以帮助我答:帮助我了解如何链接我在iTunes连接与应用程序的排行榜,并使排行榜的价值高分。 和B:使排行榜显示在应用程序的所有排名。

到目前为止,我的应用程序中的所有gamecenter代码如下所示。

接口文件:

#import <Foundation/Foundation.h> #import <GameKit/GameKit.h> @interface GCHelper : NSObject { BOOL gameCenterAvailable; BOOL userAuthenticated; } @property (assign, readonly) BOOL gameCenterAvailable; + (GCHelper *)sharedInstance; -(void)authenticateLocalUser; @end 

实施文件:

 #import "GCHelper.h" @implementation GCHelper @synthesize gameCenterAvailable; #pragma mark initialization static GCHelper *sharedHelper = nil; + (GCHelper *) sharedInstance { if (!sharedHelper) { sharedHelper = [[GCHelper alloc] init]; } return sharedHelper; } - (BOOL)isGameCenterAvailable { Class gcClass = (NSClassFromString(@"GKLocalPlayer")); NSString *reqSysVer = @"4.1"; NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending); return (gcClass && osVersionSupported); } - (id) init { if ((self = [super init])) { gameCenterAvailable = [self isGameCenterAvailable]; if(gameCenterAvailable) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(authenticationChanged) name:GKPlayerAuthenticationDidChangeNotificationName object:nil]; } } return self; } -(void)authenticationChanged { if ([GKLocalPlayer localPlayer].isAuthenticated && !userAuthenticated) { NSLog(@"Authentication changed: player authenticated."); userAuthenticated = TRUE; } else if (![GKLocalPlayer localPlayer].isAuthenticated && userAuthenticated) { NSLog(@"Authentication changed: player not authenticated"); userAuthenticated = FALSE; } } #pragma mark User Functions -(void) authenticateLocalUser { if(!gameCenterAvailable) return; NSLog(@"Authentication local user..."); if ([GKLocalPlayer localPlayer].authenticated == NO) { [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:nil]; } else { NSLog(@"Already authenticated!"); } } @end 

可以,然后呢。 代码现在正在工作,但是当访问排行榜的代码返回一个错误时,我没有代码来处理它,而只是使应用程序进入冻结状态,并使其无法正常工作。

正在调用访问排行榜的代码:

 - (void) presentLeaderboards { GKGameCenterViewController* gameCenterController = [[GKGameCenterViewController alloc] init]; gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards; gameCenterController.gameCenterDelegate = self; [self presentViewController:gameCenterController animated:YES completion:nil]; } 

要设置排行榜,请前往iTunes Connect>pipe理您的应用>您的应用>pipe理游戏中心>添加排行榜>单排行榜。

给你的排行榜一个名字和所有需要的组织信息。

将此方法添加到您的GCHelper.m

 -(void) submitScore:(int64_t)score Leaderboard: (NSString*)leaderboard { //1: Check if Game Center // features are enabled if (!_gameCenterFeaturesEnabled) { return; } //2: Create a GKScore object GKScore* gkScore = [[GKScore alloc] initWithLeaderboardIdentifier:leaderboard]; //3: Set the score value gkScore.value = score; //4: Send the score to Game Center [gkScore reportScoreWithCompletionHandler: ^(NSError* error) { [self setLastError:error]; BOOL success = (error == nil); if ([_delegate respondsToSelector: @selector(onScoresSubmitted:)]) { [_delegate onScoresSubmitted:success]; } }]; } 

并添加到您的GCHelper.h

 -(void) submitScore:(int64_t)score Leaderboard: (NSString*)leaderboard; 

现在在游戏的.m文件中添加这个方法,无论您在游戏结束时调用什么方法:

 [[GCHelper sharedGameKitHelper] submitScore:highScore Leaderboard:LeaderboardName]; 

在这个例子中, highScore是你的分数的int_64值, LeaderboardName是一个NSString等于你在iTunes Connect中设置的排行榜标识符。 还要确保将Game Centerfunction添加到您的应用程序。

之后,你应该能够提交高分!

还将此添加到GCHelper.m

 -(void) setLastError:(NSError*)error { _lastError = [error copy]; if (_lastError) { NSLog(@"GameKitHelper ERROR: %@", [[_lastError userInfo] description]); } } 

并且把这个添加到GCHelper.h中

 @property (nonatomic, assign)id<GCHelperProtocol> delegate; 

这是我的GCHelper.h:

 #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> // Include the GameKit framework #import <GameKit/GameKit.h> // Protocol to notify external // objects when Game Center events occur or // when Game Center async tasks are completed @protocol GCHelperProtocol<NSObject> -(void) onScoresSubmitted:(bool)success; @end @interface GCHelper : NSObject @property (nonatomic, assign)id<GCHelperProtocol> delegate; // This property holds the last known error // that occured while using the Game Center API's @property (nonatomic, readonly) NSError* lastError; + (id) sharedGameKitHelper; // Player authentication, info -(void) authenticateLocalPlayer; //Scores -(void) submitScore:(int64_t)score Leaderboard: (NSString*)leaderboard; @end 

在这里我的GCHelper.m:

 #import "GCHelper.h" @interface GCHelper () <GKGameCenterControllerDelegate> { BOOL _gameCenterFeaturesEnabled; } @end @implementation GCHelper #pragma mark Singleton stuff +(id) sharedGameKitHelper { static GCHelper *sharedGameKitHelper; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedGameKitHelper = [[GCHelper alloc] init]; }); return sharedGameKitHelper; } #pragma mark Player Authentication -(void) authenticateLocalPlayer { GKLocalPlayer* localPlayer = [GKLocalPlayer localPlayer]; localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { [self setLastError:error]; if (localPlayer.authenticated) { _gameCenterFeaturesEnabled = YES; } else if(viewController) { [self presentViewController:viewController]; } else { _gameCenterFeaturesEnabled = NO; } }; } #pragma mark Property setters -(void) setLastError:(NSError*)error { _lastError = [error copy]; if (_lastError) { NSLog(@"GameKitHelper ERROR: %@", [[_lastError userInfo] description]); } } #pragma mark UIViewController stuff -(UIViewController*) getRootViewController { return [UIApplication sharedApplication].keyWindow.rootViewController; } -(void)presentViewController:(UIViewController*)vc { UIViewController* rootVC = [self getRootViewController]; [rootVC presentViewController:vc animated:YES completion:nil]; } #pragma mark Scores - (void) reportAchievementWithID:(NSString*) AchievementID { [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error) { if(error) NSLog(@"error reporting ach"); for (GKAchievement *ach in achievements) { if([ach.identifier isEqualToString:AchievementID]) { //already submitted return ; } } GKAchievement *achievementToSend = [[GKAchievement alloc] initWithIdentifier:AchievementID]; achievementToSend.percentComplete = 100; achievementToSend.showsCompletionBanner = YES; [achievementToSend reportAchievementWithCompletionHandler:NULL]; }]; } -(void) submitScore:(int64_t)score Leaderboard: (NSString*)leaderboard { //1: Check if Game Center // features are enabled if (!_gameCenterFeaturesEnabled) { return; } //2: Create a GKScore object GKScore* gkScore = [[GKScore alloc] initWithLeaderboardIdentifier:leaderboard]; //3: Set the score value gkScore.value = score; //4: Send the score to Game Center [gkScore reportScoreWithCompletionHandler: ^(NSError* error) { [self setLastError:error]; BOOL success = (error == nil); if ([_delegate respondsToSelector: @selector(onScoresSubmitted:)]) { [_delegate onScoresSubmitted:success]; } }]; } -(void) gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController { //nothing } @end