离线游戏中心iOS成就

9

在离线模式下(例如开启飞行模式),尝试找到与游戏中心中成就最佳工作方式。

据我所知,iOS 5+中的游戏中心会处理离线提交的成就和分数。它充当代理缓存,并在下次用户上线时将它们提交到在线游戏中心。考虑到这一点,以下是我的做法:

用户认证成功时,我加载成就并将它们存储在一个字典中。

[GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *gcAchievments, NSError *error)
{
    if (error) { ..skipped ..}
    //This dictionary will store current achievments, so that we didn't submit them
    //once more and didn't show notification.
    achievments = [[NSMutableDictionary alloc] initWithCapacity:gcAchievments.count];

    //Storing achievments in dictionary
    for(GKAchievement *a in gcAchievments)
        [achievments setObject:a forKey:a.identifier];       
}];

稍后当我提交新成就时,我会在字典中检查成就,如果成就已经完成,我就不会提交。如果提交了成就,我也会将其添加到achievements字典(内存中),以立即反映这个成就已经提交。

GKAchievement *cachedAchievment = [achievments objectForKey:identifier];
if (cachedAchievment && cachedAchievment.percentComplete >= 100)
{
    //Already unlocked this achievment.
    return;
}

GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier: identifier];
if (achievement)
{
    achievement.percentComplete = percent;
    [achievement reportAchievementWithCompletionHandler:^(NSError *error)
     {
         if (!error)
         {
             //Flagging achievment as completed locally to avoid achieving it second time and showing notification.
             [achievments setObject:achievement forKey:achievement.identifier];

             //Now shoing notification banner.
             GKAchievementDescription * desc = [achievmentsDescriptions objectForKey:achievement.identifier];
             [[GKAchievementHandler defaultHandler] notifyAchievement:desc];
         }
         else
         {
             NSLog(@"Error in reporting achievements: %@", error);
         }
     }];
}

这种方法使我能够在游戏代码中触发提交操作,而不必担心会提交成就两次或显示通知横幅两次。

当Game Center在线时,一切都正常。但是,如果我离线,我会遇到两个问题。

  1. 加载代码返回错误,并且achievements的初始字典未填充已完成成就,这意味着每次用户启动游戏时,即使已授予,他/她也会再次收到每个成就的通知横幅。然后放入字典后不会显示,但我不想在每个游戏启动时甚至只显示一次成就。

  2. 我不确定离线提交的成就是否会在用户上线时到达Game Center。我可以使用持久性存储(如数据库)来解决问题#1,以在游戏启动之间存储成就状态,但是当Game Center上线时,我应该重新提交它们吗?我如何检测Game Center是否实际上在线,因为即使是离线的reportAchievementWithCompletionHandler也会完成而没有错误,因此我无法检测它是否未提交。这是我的测试方式,我打开了飞行模式,在线解锁了几个成就,然后关闭了飞行模式,成就未到达Game Center,尽管这可能是“沙盒”问题。

1个回答

4
添加“已解锁成就”的持久化存储,并为每个成就存储“成功提交到Game Center”的标记。然后,在联机时,启动时和定期地检查loadAchievementsWithCompletionHandler的结果,以查看是否已将每个已解锁且未提交的成就实际提交到Game Center,如果没有,则重新提交。

嘿,你知道成就的性能方面有什么了解吗?http://stackoverflow.com/questions/42631583/calling-report-achievements-performance - Esqarrouth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接