我使用函数[GKAchievement loadAchievementsWithCompletionHandler:]
恢复当前播放器在初始化中的成就。但完成汉德从未被召唤过。
- (void)loadAchievements { [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error) { if (error == nil) // !!-- if a breakpoint is set here, it would never be reached { @synchronized(_achievementsDictionary) { for (GKAchievement* achievement in achievements) [_achievementsDictionary setObject:achievement forKey:achievement.identifier]; NSLog(@"achievements loaded"); } } else { NSLog(@"Error in loading achievements: %@", error); } }]; }
但是,类似的功能[GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:]
效果很好:
- (void) retrieveAchievmentMetadata { [GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler: ^(NSArray *descriptions, NSError *error) { if (error != nil) { NSLog(@"Error in loading achievement descriptions: %@", error); } if (descriptions != nil) { @synchronized(_achievementsMetaDataDictionary) { for (GKAchievementDescription* desc in descriptions) { _achievementsMetaDataDictionary[desc.identifier] = desc; } } NSLog(@"achievement descriptions loaded"); } }]; }
可能是什么问题?
答案 0 :(得分:5)
有点晚了,但也许对别人有帮助。
事实是GKAchievement loadAchievementsWithCompletionHandler:
加载了本地玩家取得进步的所有成就。这意味着,如果在相关的iTunes Connect应用程序中设置了新的成就(没有任何进展),则不会加载它们。必须首先报告一些进展!
另一方面,GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:
旨在获得所有关于相关iTunes Connect应用的每个可用成就的信息。该描述也提供了成就的标识符。
对于一项新成就,流程如下:
GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:
)GKAchievementDescription
中的数据创建GKAchievement。 (GKAchievementDescription reportAchievements:withCompletionHandler:
)GKAchievement loadAchievementsWithCompletionHandler:
)答案 1 :(得分:0)
您是否检查过返回的descriptions
NSArray
是否没有 0个元素?
if( !descriptions.count )
printf( "User has not submitted _any_ progress on _any_ achievements\n" ) ;
else for (GKAchievementDescription* desc in descriptions) ..
请注意,此处的descriptions
数组仅返回此用户先前已在上提交进度的成就集合,不在GameCenter上注册的所有成就数组对于这个应用程序。