从未完成[GKAchievement loadAchievementsWithCompletionHandler:]

Wei*_*ang 4 iphone ios game-center

我使用该函数[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");
         }
     }];
}

可能是什么问题?

小智 5

它有点晚了,但也许它可以帮助别人.

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

在另一方面GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:是为了获得所有有关信息,每一个对关于iTunes Connect的应用程序可用的成就.该描述也提供了成就的标识符.

为了获得新的成就,流程如下:

  1. 加载成就说明.(GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:)
  2. 向Game Center报告成就的一些进展.可以根据数据创建GKAchievement GKAchievementDescription.(GKAchievementDescription reportAchievements:withCompletionHandler:)
  3. 从这一点开始,加载成就的进度以便在开始时设置您的应用程序.(GKAchievement loadAchievementsWithCompletionHandler:)


bob*_*obo 0

你检查过返回的元素descriptions NSArray不为0吗?

 if( !descriptions.count )
   printf( "User has not submitted _any_ progress on _any_ achievements\n" ) ;
 else for (GKAchievementDescription* desc in descriptions) ..
Run Code Online (Sandbox Code Playgroud)

请注意,descriptions此处的数组仅返回该用户之前在 上提交的进度的成就集合而不是曾在此应用程序的 GameCenter 上注册的所有成就的数组。