首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >离线游戏中心iOS的成就

离线游戏中心iOS的成就
EN

Stack Overflow用户
提问于 2013-01-08 20:04:24
回答 1查看 2.5K关注 0票数 9

在离线模式(例如,打开飞机模式)的情况下,试图找到最佳的方法来与游戏中心的成就一起工作。

据我所知,在iOS的游戏中心,5+负责离线提交的成绩和分数。它的作用就像代理缓存,并在下次用户联机时将它们提交到在线游戏中心。考虑到这一点,我就是这样做的:

用户身份验证成功时,我加载成就并将其存储在字典中。

代码语言:javascript
运行
复制
[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];       
}];

稍后,当我提交新的成就()时,我会在字典中检查成绩,如果成绩已经完成,就不要提交。如果我提交了成就,我也会将它添加到achievments字典(内存中),立即反射该成就已经提交。

代码语言:javascript
运行
复制
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);
         }
     }];
}

这种方法允许我触发提交游戏代码,担心我会提交两次成就或显示通知横幅两次。

游戏中心在线的时候,一切都很好。但万一我离线了我有两个问题。

  1. 加载代码返回错误,并且achievments的初始字典没有填充已经完成的成绩,这意味着每次用户启动游戏时,他/她都会再次获得每一项成就的通知横幅,即使它已经被授予。然后,当它被放入字典之后,它就不会被显示出来,但是我不想在每次游戏开始的时候展示一次成绩。
  2. 我不确定当用户上网时,离线完成的成绩是否会到达游戏中心。我可以使用持久存储(如数据库)来解决问题1,以便在游戏发布之间存储成绩状态,但在游戏中心联机时是否应该重新提交这些状态,以及如何检测游戏中心是否实际联机,因为即使脱机reportAchievementWithCompletionHandler完成时也没有错误,因此无法检测是否未提交。这里是我如何测试,我已经打开飞机模式,解锁少数成就,然后关闭飞机模式,成就不会到达游戏中心,虽然这可能是“沙箱”问题。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-20 08:54:58

为您提到的“成就解锁”添加持久存储,并为每个成就存储一个“成功提交到游戏中心”标志。然后,在线时,在启动时检查loadAchievementsWithCompletionHandler的结果,并定期查看是否每一项成就(即unlocked && !submitted )实际上已经到达游戏中心,如果没有,则重新提交。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14223114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档