GameCenterManager 5.3

GameCenterManager 5.3

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新版本2014年12月

无人认领 维护。



  • iRare Media

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的好方法。以下是项目的几个关键特性和亮点。

  • 只需一行代码即可同步、提交、保存、检索和追踪任何Game Center排行榜、成就或挑战。
  • 只需将文件拖放到您的项目中即可 - 无需复杂的设置
  • 有用的委托方法和属性可以让您访问和管理高级Game Center功能
  • iOS / OS X 示例应用说明了使用GameCenter Manager是多么容易
  • 根据用户问题和请求频繁更新项目
  • 易于为项目贡献力量

项目信息

了解更多关于项目要求、许可和贡献。

要求

  • 使用Objective-C ARC构建
  • 最低要求iOS 7.0 / OS X 10.9作为部署目标
  • 需要Xcode 5.0.1以在iOS项目中使用
  • 使用Apple LLVM编译器 5.0

许可证

您可以在个人或商业项目中修改和使用此内容。不需要署名,但我们会很感激。我们在这项工作上投入了大量时间、精力和资源,所以一点感谢(或类似的话语)会非常感激。如果您在应用中使用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页面了解详细信息。

  1. GameKitSystemConfigurationSecurity框架添加到Xcode项目
  2. 将以下类(可在GC Manager文件夹中找到)添加到Xcode项目中(确保在对话框中选中“复制项”)
    • GameCenterManager
    • Reachability
    • NSDataAES256
  3. 导入GameCenterManager.h文件
  4. 您可以使用以下方法调用初始化GameCenterManager并开始同步

    [[GameCenterManager sharedManager] setupManager]; // Or use setupManagerAndSetShouldCryptWithKey: for use with encryption
    
  5. 将代理GameCenterManagerDelegate添加到您的头文件中,然后在实现文件中设置代理并添加您要使用任何代理方法(参见代理

    [[GameCenterManager sharedManager] setDelegate:self];
    

方法

icloud文档同步有很多可用方法。以下是一些最重要的/突出显示的方法,其他所有方法都在docset中进行了说明,并在代码注释中说明了。

初始化GameCenterManager

您应该在应用启动时设置GameCenterManager。这应该只进行一次,可以在AppDelegate的application: didFinishLaunchingWithOptions:方法中执行。

[[GameCenterManager sharedManager] setupManager];

这初始化了GameCenter Manager,检查当前设备是否支持Game Center,验证玩家并从Game Center同步分数和成就。或者,您可以调用以下方法来启用本地数据的加密

[[GameCenterManager sharedManager] setupManagerAndSetShouldCryptWithKey:@"YourKey"];

这些方法不可交换。如果您决定设置加密,则不应回退到未设置加密的设置,反之亦然。这样做会导致存档和恢复保存数据时出现问题,从而导致崩溃。选择其中一个,并永远坚持下去。如果您更改了设置,需要从应用的库(在包中)中删除GameCenterManager.plist文件。

检查Game Center支持

GameCenter 管理器在执行任何与 Game Center 相关的操作之前会自动检查 Game Center 是否可用。您还可以使用以下方法检查 Game Center 是否可用,该方法返回一个 BOOL 值(是/否)。

BOOL isAvailable = [[GameCenterManager sharedManager] checkGameCenterAvailability];

此方法将按照以下顺序执行以下检查

  1. Current OS version new enough to run Game Center. iOS 4.1 或 OS X 10.8。某些 Game Center 方法需要更新的操作系统版本,这将被检查(例如挑战和一些多人游戏功能)。
  2. GameKit API 可用性。至少必须有 GKLocalPlayer 类可用。
  3. 互联网连接。使用 Reachability 类来确定是否存在有效的互联网连接。即使没有互联网,GameCenterManager 仍然可以工作,但是所有保存的数据只能在互联网连接下上传。
  4. 本地玩家。检查确保本地玩家已登录并验证。

在许多情况下,此方法可能返回 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 排序顺序(GameCenterSortOrderHighToLowGameCenterSortOrderLowToHigh)设置为向 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生成的错误。

显示GameKit ViewControllers

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没有。

认证用户(必需,仅iOS)

如果用户未登录Game Center,您需要展示Game Center登录视图控制器。该方法必需,因为用户必须登录Game Center才能工作。如果用户未登录,将返回一个错误。

 - (void)gameCenterManager:(GameCenterManager *)manager authenticateUser:(UIViewController *)gameCenterLoginController

可用性变更

当Game Center的可用性状态变更时,将调用此委托方法。Game Center的可用性取决于多个因素,包括:*互联网连接* iOS版本(需要4.1+)*玩家认证*游戏认证

NSDictionary对象availabilityInformation包含两个对象,一个message和一个titlemessage对象是一个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) 没有互联网连接