我一般都是游戏中心@游戏中的菜鸟。我正在制作我的第二个游戏并实施游戏中心。
如果互联网可用,没有问题,一切正常。 但是刚才我故意让互联网无法访问,当我获得成就时,显然它没有注册到游戏中心的成就。
处理此问题的最佳方法是什么?
谢谢....
答案 0 :(得分:2)
您可以添加无法注册到阵列的GKAchievement
个对象,然后在返回连接时重新发送它们。您还应该考虑将该数组提交给持久存储,以防您的应用程序在有机会发送这些成就之前终止。在完成处理程序中尝试此操作:
// 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)];
}
}
希望这有帮助。
答案 1 :(得分:1)
我看到这里的两个答案集中在存档未交付的成就信息的具体机制上。有关整体方法的更高级别说明,您可以查看我对此相关问题的回答:Robust Game Center Achievement code
答案 2 :(得分:0)
成就(以及排行榜更新等所有游戏中心内容)符合NSCoding。如果您收到错误并稍后提交,则可以存储它们。这是苹果在他们的文档中推荐的。
如果您的应用程序无法向Game Center报告进度,则必须处理错误。例如,当您尝试报告进度时,设备可能没有网络。应用程序处理网络错误的正确方法是保留成就对象(可能将其添加到数组中)。然后,您的应用程序需要定期尝试报告进度,直到成功报告为止。 GKAchievement类支持NSCoding协议,允许应用程序在成就对象进入后台时对其进行归档。
答案 3 :(得分:0)
// 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];
}
}];
}
}
答案 4 :(得分:0)
如果将来有人偶然发现这个问题,Apple现在会提供用于提交成就的示例代码,其中包括存档未能提交的成就的方法(由于没有网络连接等)。您可以在Game Center programming guide。
中找到它