Iphone 游戏中心-处理失败的成绩提交?

Iphone 游戏中心-处理失败的成绩提交?,iphone,game-center,achievements,Iphone,Game Center,Achievements,我通常是游戏中心@games的noob。我现在正在制作第二个游戏,并实现了游戏中心 如果互联网可用,就没有问题,一切都很好。 但刚才我故意让互联网无法访问,当我获得一项成就时,显然它没有注册到游戏中心的成就 处理这个问题的最佳方式是什么 谢谢……成就(以及所有游戏中心的东西,如排行榜更新)符合NSCoding。如果提交它们时出错,可以存储它们,以后再提交。这是苹果在他们的文档中推荐的 当应用程序无法向游戏中心报告进度时,必须处理错误。例如,当您尝试报告进度时,设备可能没有网络。应用程序处理网络错

我通常是游戏中心@games的noob。我现在正在制作第二个游戏,并实现了游戏中心

如果互联网可用,就没有问题,一切都很好。 但刚才我故意让互联网无法访问,当我获得一项成就时,显然它没有注册到游戏中心的成就

处理这个问题的最佳方式是什么

谢谢……

成就(以及所有游戏中心的东西,如排行榜更新)符合NSCoding。如果提交它们时出错,可以存储它们,以后再提交。这是苹果在他们的文档中推荐的

当应用程序无法向游戏中心报告进度时,必须处理错误。例如,当您尝试报告进度时,设备可能没有网络。应用程序处理网络错误的正确方法是保留Achization对象(可能将其添加到数组中)。然后,应用程序需要定期尝试报告进度,直到成功报告为止。GKCessment类支持NSCoding协议,允许您的应用程序在成就对象移动到后台时对其进行归档


from:

您可以将注册失败的
对象添加到阵列中,然后在恢复连接时重新发送它们。您还应该考虑将该数组提交到持久存储,以防应用程序在有机会发送这些成果之前终止。在完成处理程序中尝试以下操作:

// Load or create array of leftover achievements
if (achievementsToReport == nil) {
    achievementsToReport = [[NSKeyedUnarchiver unarchiveObjectWithFile:pathForFile(kAchievementsToReportFilename)] retain];
    if (achievementsToReport == nil) {
        achievementsToReport = [[NSMutableArray array] retain];
    }
}

@synchronized(achievementsToReport) {
    if(error == nil)
    {
        // Achievement reporting succeded

        // Resend any leftover achievements
        BOOL leftoverAchievementReported = NO;
        while ([achievementsToReport count] != 0) {
            [self resendAchievement:[achievementsToReport lastObject]];
            [achievementsToReport removeLastObject];
            leftoverAchievementReported = YES;
        }

        // Commit leftover achievements to persistent storage
        if (leftoverAchievementReported == YES) {
            [NSKeyedArchiver archiveRootObject:achievementsToReport toFile:pathForFile(kAchievementsToReportFilename)];
        }
    }
    else
    {
        // Achievement reporting failed
        [achievementsToReport addObject:theAchievement];
        [NSKeyedArchiver archiveRootObject:achievementsToReport toFile:pathForFile(kAchievementsToReportFilename)];
    }
}

希望这能有所帮助。

我看到这里的两个答案集中在归档未送达的成就信息的具体机制上。对于整体方法的更高层次的描述,您可以看到我对这个相关问题的回答:

如果将来有人偶然发现这个问题,苹果现在有一个提交成就的示例代码,其中包括一种归档未能提交的成就的方法(由于没有网络连接等)。你可以在杂志上找到。

是的,我读过。现在需要的是将这些文档翻译成代码,我不知道该怎么做。感谢您的回复。NSCoding是一种序列化对象的方法(这还不是全部,但出于您的目的就可以了)。序列化后,您可以将它们存储(即存储在文件或核心数据中)并稍后检索以重新发送。您好,Spiros,感谢您提供此示例代码。它去哪里了?我使用的是示例代码中的GameCenter.m和.h。我提供的代码片段通常应该进入
ReportAchieventWithCompletionHandler:
的完成处理程序。在gktaper的例子中,我想它应该进入
实现提交:错误:
,但这需要检查。我试图将它放入,但出现了大量错误。我放弃了。不过,如果有人能为分数和成绩制作一个简单的游戏中心助手,那就太好了。我会为我的游戏尝试其他东西…我感觉到你的痛苦。我同样对整合Game Center和覆盖所有角度所需的工作量感到失望。您应该修改我的代码片段以适合您的特定环境。至少,您应该有一个
NSMutableArray*acquirementstoreport
ivar、一个
pathForFile(NSString*filename)
函数、一个定义的
kAchievementsToReportFilename
常量和一个
resendAchievement:(gkachievement*)ach
方法类似于
submitAchievement:percentComplete:
方法。我最终制定了自己的方法。无论如何谢谢你的帮助。
    // Submit an achievement to the server and store if submission fails
- (void)submitAchievement:(GKAchievement *)achievement 
{
    if (achievement)
    {
        // Submit the achievement. 
        [achievement reportAchievementWithCompletionHandler: ^(NSError *error)
        {
            if (error)
            {
                // Store achievement to be submitted at a later time. 
                [self storeAchievement:achievement];
            }
            else
            {
                 NSLog(@"Achievement %@ Submitted..",achievement);
                if ([storedAchievements objectForKey:achievement.identifier]) {
                    // Achievement is reported, remove from store.
                    [storedAchievements removeObjectForKey:achievement.identifier];
                } 
                [self resubmitStoredAchievements];
            }
        }];
    }
}