离线游戏中心 iOS 成就

Posted

技术标签:

【中文标题】离线游戏中心 iOS 成就【英文标题】:Offline Game Center iOS Achievements 【发布时间】:2012-12-22 18:51:29 【问题描述】:

尝试找出在离线模式(例如打开飞行模式)的情况下使用 Game Center 中成就的最佳方式。

据我了解,ios 5+ 中的 Game Center 负责离线提交的成就和分数。它就像一个代理缓存,并在用户下次在线时将它们提交到在线游戏中心。考虑到这一点,我就是这样做的:

用户身份验证成功后,我会加载成就并将它们存储在字典中。

[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 字典(内存中),以立即反映该成就已经提交。

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 在线时一切正常。但如果我离线,我有 2 个问题。

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

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

【问题讨论】:

【参考方案1】:

为您提到的“成就解锁”添加持久存储,并为每个成就存储“成功提交到游戏中心”标志。然后,在线时,在启动时检查来自loadAchievementsWithCompletionHandler 的结果,并定期查看unlocked && !submitted 的每个成就是否真正到达了游戏中心,如果没有则重新提交。

【讨论】:

你好,你知道成就的表现吗? ***.com/questions/42631583/…

以上是关于离线游戏中心 iOS 成就的主要内容,如果未能解决你的问题,请参考以下文章

谷歌游戏服务离线

如何对Nessus离线激活及升级插件

排查指南 | 两个案例学会从埋点排查 iOS 离线包

steam离线模式很多人玩一个账号存档会冲突吗

iOS 中的离线通知

用 Python 为离线游戏创建排行榜