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

时间:2011-07-18 13:27:09

标签: iphone game-center achievements

我一般都是游戏中心@游戏中的菜鸟。我正在制作我的第二个游戏并实施游戏中心。

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

处理此问题的最佳方法是什么?

谢谢....

5 个答案:

答案 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协议,允许应用程序在成就对象进入后台时对其进行归档。

来自:http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Achievements/Achievements.html#//apple_ref/doc/uid/TP40008304-CH7-SW13

答案 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

中找到它