强大的游戏中心成就代码

在几乎所有向Game Center提交成就的例子中,我都看到了这个代码

[achievement reportAchievementWithCompletionHandler:^(NSError *error) { if (error != nil) { // Retain the achievement object and try again later (not shown). } }]; 

问题是,一个小小的评论是关于99%的工作。 我花了几个小时试图弄清楚这一点,似乎是发送和重新发送以及保存和加载数据的边缘案例层出不穷。

有没有人知道一个很好的教程(或示例代码),这实际上解释了困难的一部分?

这不是简单的把它们保存到一个文件,然后加载它们。 当你开始不得不保留多个成就,并提交它们,然后他们都回来失败(在块!),你必须再次保存…快速/安全…因为该应用程序可能会退出,你不想放松他们。

我正在拉我的头发。

我不认为你需要把头发拉出来。

我认为基本的模式是这样的:

(a)独立于游戏中心,您的游戏处于保存状态(无论如何,您总是需要将游戏恢复到游戏退出/后台时的状态)。 这个状态应该包括你需要恢复你的游戏状态的所有正常的东西,另外还应该包括游戏中所有成就的标志。

(二)游戏中心也存储在您的游戏中的所有成就。 当您连接到Game Center时,您可以下载login的玩家的成就。 (关于login玩家是 ,但是您的问题并不在于此,所以让我们假设“真正的玩家”始终是已login的Game Center玩家)。

(c)当玩家取得成就时,首先更新游戏保存的状态数据中的相应成就标志。 其次,试着告诉游戏中心这个成就。 如果有效,请使用新数据更新您的游戏中心成就副本。

(d)如果它不起作用,你的持续状态中有一个标记没有标记在Game Center状态的副本中。 在各种方便的时间(例如,每当获得另一个成就,结束一个级别,应用程序启动时,应用程序退出等时),检查在你自己的状态和在什么状态之间有什么不一致游戏中心状态。 差异是您需要重新发送到Game Center的更新。 尝试发送,但如果再次失败,请等待下一个机会(例如,每当获得另一个成就,结束一个关卡时,应用程序启动时,应用程序退出等)时重试。 你永远不会丢失数据,因为它在你本地,真实的用户状态图像中。 (唯一的方法就是在用户卸载应用程序之后才能成功将其发送到Game Center,但是,您可以做什么?)