1

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

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

处理这个问题的最佳方法和方法是什么?

谢谢....

4

5 回答 5

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)];
    }
}

希望这可以帮助。

于 2011-07-18T14:06:55.307 回答
1

我看到这里的两个答案都集中在归档未传递的成就消息的具体机制上。有关整体方法的更高级别描述,您可以查看我对这个相关问题的回答:Robust Game Center Achievement code

于 2012-03-31T08:34:53.850 回答
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];
            }
        }];
    }
}
于 2012-10-22T07:00:34.760 回答
0

万一将来有人偶然发现这个问题,Apple 现在有提交成就的示例代码,其中包括存档未能提交的成就(由于没有网络连接等)的方法。您可以在Game Center 编程指南中找到它。

于 2013-02-18T15:45:10.227 回答
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

于 2011-07-18T13:52:53.840 回答