离线游戏中心iOS成就

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

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

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

[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]; }]; 

之后当我提交新的成就时,我会检查字典中的成就,如果成绩已经完成,请不要提交。 如果我提交成果,我也把它添加到成绩字典(内存),立即重新指出,这个成就已经提交。

 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个问题。

  1. 加载代码返回错误,并且成就的初始字典没有填充已经完成的成就,这意味着每次用户启动游戏时,他/她再次获得每个成就的通知标志,即使它已经被授予。 然后放入字典后不显示,但我不希望显示每个游戏开始一次成就。

  2. 当用户上线时,我不确定离线成绩是否会到达Game Center。 我可以使用永久性存储(如数据库)来解决游戏启动之间的成就状态,但是如果我在Game Center在线时应该重新提交它们,并且如何检测Game Center是否实际上在线,因为即使离线, reportAchievementWithCompletionHandler完成而不会出错,所以我无法检测是否没有提交。 这里是我如何testing,我已经打开飞行模式,解锁一些成就,然后closures飞行模式,成就没有达到游戏中心,虽然这可能是“沙盒”的问题。

为你提到的“成就解锁”添加持久性存储,并为每个成就存储“成功提交到游戏中心”标志。 然后,在线时,请在启动时检查loadAchievementsWithCompletionHandler的结果,并定期查看每个已unlocked && !submitted成果是否已实际到达Game Center,如果不是,则重新提交。