IOS 7排行榜中的游戏中心
我已成功将游戏中心功能添加到我的应用中。当应用程序打开时,它成功验证用户并显示欢迎回来(用户名)横幅。
I have successfully added Game Center capabilities to my app. When the app is opened it successfully authenticates the user and shows the "Welcome back (UserName)" banner.
但是,我不确定如何添加排行榜游戏。我想知道是否有人可以帮助我A:帮助我了解如何链接我在iTunes中制作的排行榜与应用程序连接并高度评价排行榜的价值。并且B:让排行榜在所有排名中显示在应用程序中。
However, I am not sure of how to add a leaderboard to the game. I was wondering if someone could help me A: Help me understand how to link the leaderboard i made in iTunes connect with the app and make highscore the value of the leaderboard. And B: Make the leaderboard show up in the app with all the rankings.
到目前为止我的应用程序中的gamecenter的所有代码都在下面。
All the code for gamecenter in my app so far is below.
接口文件:
#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
OKAY所以。代码现在正在运行,但是当访问排行榜的代码返回错误时,我没有代码来处理它,而只是让应用程序进入冻结状态并使其无法运行。
OKAY, so. The code is working now but when the code to access the leaderboard returns an error, I have no code to handle it and instead just makes the app go into a frozen state and makes it unable to function.
调用访问排行榜的代码:
Code being called to access leaderboard :
- (void) presentLeaderboards
{
GKGameCenterViewController* gameCenterController = [[GKGameCenterViewController alloc] init];
gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards;
gameCenterController.gameCenterDelegate = self;
[self presentViewController:gameCenterController animated:YES completion:nil];
}
设置排行榜转到iTunes Connect>管理您的应用>您的应用>管理游戏中心>添加排行榜>单个排行榜。
To set up a leaderboard go to iTunes Connect > Manage Your Apps > Your App > Manage Game Center > Add Leaderboard > Single Leaderboard.
为您的排行榜命名并提供所需的全部信息需要组织信息。
Give your leaderboard a name and all of the required organizational information needed.
将此方法添加到 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中将此方法添加到游戏结束时调用的任何方法:
Now in the .m for your game add this method to whatever method you call when the game is over:
[[GCHelper sharedGameKitHelper] submitScore:highScore Leaderboard:LeaderboardName];
在此示例中 highScore
是 int_64
您的分数值和 LeaderboardName
是一个 NSString
等于您在iTunes Connect中设置的排行榜标识符。还要确保为您的应用程序添加Game Center功能。
In this example highScore
is the int_64
value of your score and LeaderboardName
is an NSString
equal to the Leaderboard Identifier you set up in iTunes Connect. Also be sure to add Game Center capabilities to your application.
之后您应该能够提交高分!
After that you should be able to submit high scores!
还添加到GCHelper.m
ALSO ADD THIS TO GCHelper.m
-(void) setLastError:(NSError*)error {
_lastError = [error copy];
if (_lastError) {
NSLog(@"GameKitHelper ERROR: %@", [[_lastError userInfo]
description]);
}
}
并将其添加到GCHelper.h
AND ALSO ADD THIS TO GCHelper.h
@property (nonatomic, assign)id<GCHelperProtocol> delegate;
这是我的GCHelper.h:
Here is my 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:
And here my 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