问题
你想获取本地玩家的成就进度。
解决方案
调用GKAchievement类的loadAchievementsWithCompletionHandler:类方法。
讨论
正如编程获取排行榜信息(条目1.11),我们也可以编程获取成就的最新进度信息,步骤如下:
1. 验证本地玩家(条目1.5)。
2. 调用GKAchievement类的loadAchievementsWithCompletionHandler:类方法。该方法接受一个返回void、接受两个参数的块对象。块对象的第一个参数是一个NSArray数组,它将包含从游戏中心取得的成就。第二个参数是一个NSError类型,将包含处理过程中发生的错误。
3. 枚举成就数组中的对象。每个对象都是GKAchievement类型。
下面是示例:
- (void) authenticateAndGetAchievements{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
NSLog(@"Authenticating the local player...");
[localPlayer authenticateWithCompletionHandler:^(NSError *error) {
if (error == nil){
NSLog(@"Successfully authenticated the local player.");
[GKAchievement loadAchievementsWithCompletionHandler:
^(NSArray *achievements, NSError *error) {
NSUInteger counter = 1;
for (GKAchievement *achievement in achievements){
NSLog(@"Achievement %lu = %@",
(unsigned long)achievement,
achievement);
counter++;
}
}];
} else {
NSLog(@"Failed to authenticate the local player. %@", error);
}
}];
}
在调用authenticateAndGetAchievements方法之前,我在iTunes Connect中添加了另外一个成就(条目1.13),然后提交了一个10%的进度。因此,调用该方法我获得了如下的结果:
Authenticating the local player...
Successfully authenticated the local player.
Achievement 111340288 = id: MGL1HP1C 50.000000
Achievement 111379664 = id: MGL1HP2C 10.000000
显然,你不会获得和我完全相同的结果;这依赖于设置的成就及其进度。
如你在条目1.13中所见,每个成就都拥有两个描述:一个在玩家完成之前显示,另一个在玩家完成之后显示。你必须使用GKAchievementDescription来获取这两个描述,而不是GKAchievement。具体点说,用的是GKAchievementDescription类的loadAchievementDescriptionsWithCompletionHandler:类方法获取对本地玩家有效的所有成就。每个成就都被封装到一个GKAchievementDescription对象中。loadAchievementDescriptionsWithCompletionHandler:方法接受一个返回void的块对象作为参数。该块对象拥有一个NSArray参数,它将包含获取到的成就;还拥有一个NSError参数,它将包含可能发生的错误。下面是示例:
- (void) authenticateAndGetAchievementsInfo{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
NSLog(@"Authenticating the local player...");
[localPlayer authenticateWithCompletionHandler:^(NSError *error) {
if (error == nil){
NSLog(@"Successfully authenticated the local player.");
[GKAchievementDescription
loadAchievementDescriptionsWithCompletionHandler:
^(NSArray *descriptions, NSError *error) {
NSUInteger counter = 1;
for (GKAchievementDescription *description in descriptions){
NSLog(@"Achievement %lu. Description = %@",
(unsigned long)counter,
descriptions);
counter++;
}
}];
} else {
NSLog(@"Failed to authenticate the local player. %@", error);
}
}];
}
下面是authenticateAndGetAchievementsInfo方法可能的打印结果:
Authenticating the local player...
Successfully authenticated the local player.
Achievement 1. Description = (
"id: MGL1HP1C\tvisible\tYou came out of
Hidden Path 1 alive. Great job.",
"id: MGL1HP2C\tvisible\tYou found Hidden
Path 2. Congratulations."
)
Achievement 2. Description = (
"id: MGL1HP1C\tvisible\tYou came out of
Hidden Path 1 alive. Great job.",
"id: MGL1HP2C\tvisible\tYou found Hidden
Path 2. Congratulations."
)
成就描述对象包含一个ID;该ID可以用来和前面取得的成就对象进行匹配。