GameCenter Manager帮助管理iOS和Mac应用中的Game Center。报告和追踪不同玩家的高分数、成就和挑战。GameCenter Manager还负责繁重的工作 - 检查互联网可用性、离线保存数据并在在线时上传等。在未来更新中,GameCenter Manager将使设置和运行实时Game Center多人游戏比赛变得简单。
如果您喜欢这个项目,请在GitHub上给它 starred!关注GitHub上的项目以获取更新。如果您在您的应用中使用GameCenter Manager,请向[email protected]或通过Twitter @iRareMedia告诉我们。
GameCenter Manager是在iOS或OS X应用中使用Game Center的好方法。以下是项目的几个关键特性和亮点。
了解更多关于项目要求、许可和贡献。
您可以在个人或商业项目中修改和使用此内容。不需要署名,但我们会很感激。我们在这项工作上投入了大量时间、精力和资源,所以一点感谢(或类似的话语)会非常感激。如果您在应用中使用GameCenter Manager,请发送电子邮件到[email&protected],或在Twitter @iRareMedia上告诉我们。查看完整的GameCenter Manager许可协议。
我们热忱欢迎任何形式的贡献!您可以通过GitHub上的pull请求和问题进行贡献。
GameCenter Manager的示例应用便于在Mac和iOS上测试使用GameCenter Manager的Game Center集成。它还展示了如何使用GameCenterManager
类。我们建议您不要修改随示例应用提供的Bundle ID,这个Bundle ID已经在iTunes Connect上链接到Game Center的游戏,并具有分数和成就。但是,您可以替换为自己的Bundle ID和权限文件。
以下是GameCenterManager类中可用的所有方法、属性、类型和代理方法。如果您在使用带有GameCenter Manager的Xcode 5,文档可以直接在Xcode中查看(只需按住Option键并点击任何方法即可获得快速帮助)。
设置GameCenter Manager非常直接。以下说明不涉及如何启用应用中的Game Center。您在设置GameCenter Manager之前需要设置Game Center。请参考wiki页面了解详细信息。
GameKit
、SystemConfiguration
和Security
框架添加到Xcode项目GameCenterManager.h
文件您可以使用以下方法调用初始化GameCenterManager并开始同步
[[GameCenterManager sharedManager] setupManager]; // Or use setupManagerAndSetShouldCryptWithKey: for use with encryption
将代理GameCenterManagerDelegate
添加到您的头文件中,然后在实现文件中设置代理并添加您要使用任何代理方法(参见代理)
[[GameCenterManager sharedManager] setDelegate:self];
icloud文档同步有很多可用方法。以下是一些最重要的/突出显示的方法,其他所有方法都在docset中进行了说明,并在代码注释中说明了。
您应该在应用启动时设置GameCenterManager。这应该只进行一次,可以在AppDelegate的application: didFinishLaunchingWithOptions:
方法中执行。
[[GameCenterManager sharedManager] setupManager];
这初始化了GameCenter Manager,检查当前设备是否支持Game Center,验证玩家并从Game Center同步分数和成就。或者,您可以调用以下方法来启用本地数据的加密
[[GameCenterManager sharedManager] setupManagerAndSetShouldCryptWithKey:@"YourKey"];
这些方法不可交换。如果您决定设置加密,则不应回退到未设置加密的设置,反之亦然。这样做会导致存档和恢复保存数据时出现问题,从而导致崩溃。选择其中一个,并永远坚持下去。如果您更改了设置,需要从应用的库(在包中)中删除GameCenterManager.plist
文件。
GameCenter 管理器在执行任何与 Game Center 相关的操作之前会自动检查 Game Center 是否可用。您还可以使用以下方法检查 Game Center 是否可用,该方法返回一个 BOOL
值(是/否)。
BOOL isAvailable = [[GameCenterManager sharedManager] checkGameCenterAvailability];
此方法将按照以下顺序执行以下检查
GKLocalPlayer
类可用。Reachability
类来确定是否存在有效的互联网连接。即使没有互联网,GameCenterManager 仍然可以工作,但是所有保存的数据只能在互联网连接下上传。在许多情况下,此方法可能返回 NO。要获取有关为什么 Game Center 可用不可用的信息,请使用 gameCenterManager:availabilityChanged:
代理方法获取一个包含信息的 NSDictionary
。请参阅下面的代理方法部分。
使用 Game Center 排行榜 ID 向 Game Center 报告分数。分数将被本地保存,然后如果 Game Center 可用,则上传到 Game Center。
[[GameCenterManager sharedManager] saveAndReportScore:1000 leaderboard:@"Leaderboard ID" sortOrder:GameCenterSortOrder];
将 Game Center 排序顺序(GameCenterSortOrderHighToLow
或 GameCenterSortOrderLowToHigh
)设置为向 Game Center 报告分数,只有在新分数比最佳分数更好(取决于排序顺序)时才需要这样做。在提交之前,您不需要确定用户是否打破了他们的最高分 - GameCenterManager 将根据提供的参数确定是否应该提交分数。
使用 Game Center 成就 ID 向 Game Center 报告成就。成就及其完成百分比将被本地保存,然后如果 Game Center 可用,就上传到 Game Center。
[[GameCenterManager sharedManager] saveAndReportAchievement:@"Achievement ID" percentComplete:50];
参数 percentComplete
指定用户在成就上取得的进展。指定 100 将将成就标记为完成。介于 1-99 之间的值将在 Game Center 中显示,并显示用户需要进一步努力才能获得成就。如果你指定的成就百分比完成小于当前的百分比完成,则 Game Center 将忽略它。
您可以从中获取多个排行榜或仅获取一个排行榜的高分。在两种情况下,您都需要提供排行榜 ID。GameCenterManager 将返回一个包含整数分数的 NSDictionary,或者一个整数分数。要从多个排行榜中获取当前玩家的最高分
// Array of leaderboard ID's to get high scores for
NSArray *leaderboardIDs = [NSArray arrayWithObjects:@"Leaderboard1", @"Leaderboard2", nil];
// Returns a dictionary with leaderboard ID's as keys and high scores as values
NSDictionary *highScores = [[GameCenterManager sharedManager] highScoreForLeaderboards:leaderboardIDs];
从单个排行榜中获取当前玩家的最高分
// Returns an integer value as a high scores
int highScore = [[GameCenterManager sharedManager] highScoreForLeaderboard:@"LeaderboardID"];
您可以获取多个成就或单个成就的成就进度。在两种情况下,您都需要提供成就 ID。GameCenterManager 将返回一个包含双精度值(double values)的 NSDictionary,或者一个双精度值。要从多个成就中获取当前玩家的成就进度
// Array of achievement ID's to get progress for
NSArray *achievementIDs = [NSArray arrayWithObjects:@"Achievement1", @"Achievement2", nil];
// Returns a dictionary with achievement ID's as keys and progresses as values
NSDictionary *achievementsProgress = [[GameCenterManager sharedManager] progressForAchievements:achievementIDs];
从单个成就中获取当前玩家的成就进度
// Returns a double value as achievement progress
double progress = [[GameCenterManager sharedManager] highScoreForLeaderboard:@"LeaderboardID"];
从游戏中心清除并重置所有成就进度。不过要小心,resetAchievements:
方法在重置前不会提示用户,你必须自己进行这项操作。目前,成就在游戏中心已被正确移除,但缓存问题导致它们在本地仍然存在。如果您能修复此问题,请提交一个pull请求。
[[GameCenterManager sharedManager] resetAchievementsWithCompletionHandler:^(NSError *error) {
if (error) NSLog(@"Error: %@", error);
}];
当调用 resetAchievements:
方法并重置所有成就时,会触发完成处理程序。您可以使用完成处理程序来检索错误或更新用户界面元素(例如,更新一个列出已完成成就的表格视图)。
在iOS 6及以上版本中获取当前游戏和玩家的挑战(GameCenterManager将检查当前设备是否支持挑战)。此方法使用完成处理程序传递数据(一个NSError
或包含挑战的NSArray
。如果GKChallenge类或GameCenter不可用,将调用gameCenterManager: error:
代理方法。
// Gets an array with challenges and passes the value to a completion handler.
[[GameCenterManager sharedManager] getChallengesWithCompletion:^(NSArray *challenges, NSError *error) {
NSLog(@"Challenges: %@ \n Error: %@", challenges, error);
}];
如果获取挑战时出现错误,NSArray
将是nil
,而NSError
将包含一个错误。此处传递的NSError
是Game Center生成的错误,而不是GameCenterMananger生成的错误。
GameCenter Manager简化了GameKit ViewControllers的显示过程。要显示排行榜视图控制器,请调用以下方法
[[GameCenterManager sharedManager] presentLeaderboardsOnViewController:self];
要显示成就视图控制器,请调用以下方法
[[GameCenterManager sharedManager] presentAchievementsOnViewController:self];
要显示挑战视图控制器,请调用以下方法
[[GameCenterManager sharedManager] presentChallengesOnViewController:self];
GameCenterManager提供了四种不同的方法来检索有关当前本地玩家的各种数据。使用以下方法检索玩家ID,但决不能在您的界面中显示玩家ID或将ID以任何方式公开 - 它只应用于标识玩家。如果您的应用中显示了玩家ID,它将被AppStore拒绝。
NSString *playerID = [[GameCenterManager sharedManager] localPlayerId];
要获取玩家的显示名称(iOS 6.0以下的iOS上的别名)请用此方法
NSString *playerName = [[GameCenterManager sharedManager] localPlayerDisplayName];
要获取玩家的个人资料图片,请使用以下方法。在iOS上,完成处理程序传递一个UIImage
,在OS X上传递一个NSImage
。传递给您的图像是全分辨率的。
[self localPlayerPhoto:^(UIImage *playerPhoto) { // On OS X, the completion handler pases an NSImage instead of a UIImage
UIImageView *imageView = [[UIImageView alloc] initWithImage:playerPhoto];
}];
要获取有关玩家的其他数据,请使用此方法
GKLocalPlayer *player = [[GameCenterManager sharedManager] localPlayerData];
GameCenter Manager的委托方法会通知您Game Center的状态和各项任务的状态。iOS只有一个必需的委托方法,而OS X没有。
如果用户未登录Game Center,您需要展示Game Center登录视图控制器。该方法必需,因为用户必须登录Game Center才能工作。如果用户未登录,将返回一个错误。
- (void)gameCenterManager:(GameCenterManager *)manager authenticateUser:(UIViewController *)gameCenterLoginController
当Game Center的可用性状态变更时,将调用此委托方法。Game Center的可用性取决于多个因素,包括:*互联网连接* iOS版本(需要4.1+)*玩家认证*游戏认证
NSDictionary对象availabilityInformation
包含两个对象,一个message
和一个title
。message
对象是一个iOSString,描述了可用性问题。该title
是错误的简短描述;它也是一个iOSString。
- (void)gameCenterManager:(GameCenterManager *)manager availabilityChanged:(NSDictionary *)availabilityInformation
当执行游戏中心任务时出现错误,将执行此委托方法。
error
NSError对象包含一个错误代码(参考下面的常数部分)、一个描述(错误域)以及有时用户信息。
- (void)gameCenterManager:(GameCenterManager *)manager error:(NSError *)error
在成功保存、上传并将分数发布到游戏中心后调用。
GKScore对象score
是保存的最终分数。错误对象可能包含错误,或者可能是nil。
- (void)gameCenterManager:(GameCenterManager *)manager reportedScore:(GKScore *)score withError:(NSError *)error;
在成功保存提交分数但未发布或上传到游戏中心后调用。保存的分数将在GC Manager能够成功连接到游戏中心时上传。
GKScore对象score
包含关于提交分数的信息。
- (void)gameCenterManager:(GameCenterManager *)manager didSaveScore:(GKScore *)score
在提交的成就及其完成百分比成功保存、上传和发布到游戏中心后调用。
GKAchievement对象achievement
是保存的最终成就。如果发生错误,错误对象可能包含错误,或可能是nil。
- (void)gameCenterManager:(GameCenterManager *)manager reportedAchievement:(GKAchievement *)achievement withError:(NSError *)error
在提交的成就成功保存但未发布或上传到游戏中心后调用。保存的成就及其完成百分比将在GC Manager能够成功连接到游戏中心时上传。
GKAchievement对象achievement
是保存的最终成就。
- (void)gameCenterManager:(GameCenterManager *)manager didSaveAchievement:(GKAchievement *)achievement
常数在GameCenter Manager中用于错误消息和方法参数中。
您的排行榜分数的排序顺序。这有助于GameCenterManager决定如何将分数提交到排行榜(并确定它是否是高分)。
- GameCenterSortOrderHighToLow
从最高分到最低分排序分数
- GameCenterSortOrderLowToHigh
从最低分到最高分排序分数
当调用gameCenterManager: error:
委托时,会传递以下错误代码之一。
- GCMErrorUnknown
(0) 发生了未知错误
- GCMErrorNotAvailable
(1) 功能不可用或游戏中心不可用
- GCMErrorFeatureNotAvailable
(2) 请求的功能不可用,请检查错误消息以获取信息
- GCMErrorInternetNotAvailable
(3) 没有互联网连接