5

我在初始化时使用该函数[GKAchievement loadAchievementsWithCompletionHandler:]来恢复当前播放器的成就。但是,completionHander 从未被调用过。

- (void)loadAchievements
{
    [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error)
     {
         if (error == nil) // !!-- 如果在此处设置断点,则永远不会到达
         {
             @synchronized(_achievementsDictionary)
             {
                 for (GKAchievement* 成就中的成就)
                     [_achievementsDictionary setObject:achievement forKey:achievement.identifier];
                 NSLog(@"成就加载");
             }
         }
         别的
         {
             NSLog(@"加载成就时出错:%@", error);
         }
     }];
}

但是,类似的功能[GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:]效果很好:

-(无效)retrieveAchievmentMetadata
{
    [GKAchievementDescription 加载AchievementDescriptionsWithCompletionHandler:
     ^(NSArray *descriptions, NSError *error) {
         如果(错误!=零)
         {
             NSLog(@"加载成就描述错误:%@", error);
         }
         如果(描述!= nil)
         {
             @synchronized(_achievementsMetaDataDictionary)
             {
                 for (GKAchievementDescription* desc in descriptions)
                 {
                     _achievementsMetaDataDictionary[desc.identifier] = desc;
                 }
             }
             NSLog(@"已加载成就描述");
         }
     }];
}

可能是什么问题?

4

2 回答 2

5

它来得有点晚,但也许它可以帮助别人。

事实是GKAchievement loadAchievementsWithCompletionHandler:加载了本地玩家取得进展的所有成就。这意味着,如果在相关的 iTunes Connect 应用程序中设置了新的成就(没有任何进展),它们将不会被加载。必须先报告一些进展!

另一方面GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:,旨在获取有关 iTunes Connect 应用程序的每个可用成就的所有信息。描述也提供了成就的标识符。

对于新的成就,流程如下:

  1. 加载成就描述。( GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:)
  2. 向 Game Center 报告成就的一些进展。GKAchievement 可以基于GKAchievementDescription. ( GKAchievementDescription reportAchievements:withCompletionHandler:)
  3. 从此时开始,加载成就的进度以在启动时设置您的应用程序。( GKAchievement loadAchievementsWithCompletionHandler:)
于 2013-12-05T08:02:49.273 回答
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 上注册的所有成就的数组。

于 2013-09-22T14:28:12.690 回答