在向Game Center提交成就的几乎所有例子中,我都看到了这段代码
[achievement reportAchievementWithCompletionHandler:^(NSError *error)
{
if (error != nil)
{
// Retain the achievement object and try again later (not shown).
}
}];
Run Code Online (Sandbox Code Playgroud)
问题是,一个小的评论是大约99%的工作.我花了最后几个小时试图解决这个问题,似乎是一组无休止的发送和重发以及保存和加载数据的边缘情况.
有没有人知道一个很好的教程(或示例代码),这实际上解释了困难的部分?
它并不像将它们保存到文件并稍后加载它们那么简单.当你开始不得不保留多个成就并在以后提交它们然后它们都回来失败(在块中!)你会遇到麻烦你必须再次保存它们......快速/安全...因为应用程序可能会退出并且你不想放松它们.
我把头发拉了出来.
我认为你不需要拔掉头发.
我认为基本模型是这样的:
(a)独立于游戏中心,你的游戏有一个保存状态(无论如何你总是需要,将玩家恢复到游戏退出/后退时的状态).此状态应包括恢复游戏状态所需的所有正常内容,此外还应包含游戏中所有成就的标记.
(b)游戏中心还存储游戏中的所有成就.当您连接到Game Center时,您可以下载已登录播放器的成就.(关于登录的玩家是谁,并且你的问题与此无关,所以让我们假设"一个真正的玩家"始终是登录的游戏中心玩家.)
(c)每当玩家取得成就时,首先在游戏保存的状态数据中更新相应的成就标志.其次,尝试告诉Game Center这个成就.如果有效,请使用新数据更新您的游戏中心成就副本.
(d)如果它不起作用,您在持久状态中标记的成就未在您的游戏中心状态副本中标记.在各种方便的时间(例如,每当获得另一个成就,当您结束一个级别,当您的应用程序启动时,当您的应用程序退出时等)时,检查您自己的状态与所在状态之间是否存在任何差异.游戏中心状态.差异是您需要重新发送到Game Center的更新.尝试发送,但如果它再次失败,只需等到下一次机会(例如,每当获得另一个成就,当你结束一个级别,当你的应用程序启动时,当你的应用程序退出时等)再试一次.您永远不会丢失数据,因为它位于用户状态的本地真实图片中.(丢失它的唯一方法是,如果用户在您成功将其发送到Game Center之前卸载了您的应用,那么,您可以做什么?)
| 归档时间: |
|
| 查看次数: |
912 次 |
| 最近记录: |