You can add GKAchievement objects that are not registered in the array, and then resend them when you return to the connection. You should also consider transferring this array to persistent storage if the application terminates before it can send these achievements. Try this in the completion handler:
// 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)]; } }
Hope this helps.
source share