Разблокировка достижений Game Center более одного раза

Я ознакомился с замечательным онлайн-руководством по использованию Game Center в ваших приложениях для iOS. Его можно найти здесь: http://code.tutsplus.com/tutorials/ios-sdk-game-center-achievements-and-leaderboards-part-2--mobile-5801

Однако код для отправки достижений, кажется, разблокирует достижения, которые уже были разблокированы, и я не понимаю, почему. Вот мой метод, который имеет дело с достижениями:

-(void)submitAchievement:(NSString*)identifier percentComplete:(double)percentComplete {

if (self.earnedAchievementCache == NULL) {

    [GKAchievement loadAchievementsWithCompletionHandler: ^(NSArray *scores, NSError *error) {

        if (error == NULL) {
            NSMutableDictionary *tempCache = [NSMutableDictionary dictionaryWithCapacity: [scores count]];

            for (GKAchievement *score in tempCache) {
                [tempCache setObject: score forKey: score.identifier];
            }

            self.earnedAchievementCache = tempCache;
            [self submitAchievement:identifier percentComplete: percentComplete];
        }

        else {
            // Something broke loading the achievement list. Error out, and we'll try again the next time achievements submit.
            [self callDelegateOnMainThread: @selector(achievementSubmitted:error:) withArg: NULL error: error];
        }
    }];
}

else {
    // Search the list for the ID we're using...
    GKAchievement *achievement = [self.earnedAchievementCache objectForKey:identifier];

    if (achievement != NULL) {

        if ((achievement.percentComplete >= 100.0) || (achievement.percentComplete >= percentComplete)) {
            // Achievement has already been earned so we're done.
            achievement = NULL;
        }

        achievement.percentComplete = percentComplete;
    }

    else {
        achievement = [[[GKAchievement alloc] initWithIdentifier:identifier] autorelease];
        achievement.percentComplete = percentComplete;
        // Add achievement to achievement cache...
        [self.earnedAchievementCache setObject:achievement forKey:achievement.identifier];
    }

    if (achievement != NULL) {
        // Submit the Achievement...
        [achievement reportAchievementWithCompletionHandler: ^(NSError *error) {
            [self callDelegateOnMainThread:@selector(achievementSubmitted:error:) withArg:achievement error:error];
        }];
    }
}
}

Спасибо за ваше время, Дэн.

1 ответ

Решение

Можете ли вы попробовать этот код и посмотреть журнал. Я добавил операторы NSLog, чтобы увидеть, обнаруживает ли код, что достижение выполнено, и устанавливает достижение равным нулю. Также удалите NULL из кода. Дайте мне знать, как это работает.

-(void)submitAchievement:(NSString*)identifier percentComplete:(double)percentComplete {

if (!self.earnedAchievementCache) {

    [GKAchievement loadAchievementsWithCompletionHandler: ^(NSArray *scores, NSError *error) {

        if (!error) {
            NSMutableDictionary *tempCache = [NSMutableDictionary dictionaryWithCapacity: [scores count]];

            for (GKAchievement *score in scores) { // the error is here
                [tempCache setObject: score forKey: score.identifier];
            }

            self.earnedAchievementCache = tempCache;
            [self submitAchievement:identifier percentComplete: percentComplete];
        }

        else {
            // Something broke loading the achievement list. Error out, and we'll try again the next time achievements submit.
            [self callDelegateOnMainThread: @selector(achievementSubmitted:error:) withArg: NULL error: error];
        }
    }];
}else {
    // Search the list for the ID we're using...
    GKAchievement *achievement = [self.earnedAchievementCache objectForKey:identifier];
    NSLog(@"achievement %f",achievement.percentComplete);
    if (achievement) {

        if ((achievement.percentComplete >= 100.0) || (achievement.percentComplete >= percentComplete)) {
            NSLog(@"Achievement has already been earned so we're done.");
            achievement = nil;
        }else{
                achievement.percentComplete = percentComplete;
        }


    }else {
        achievement = [[[GKAchievement alloc] initWithIdentifier:identifier] autorelease];
        achievement.percentComplete = percentComplete;
        // Add achievement to achievement cache...
        [self.earnedAchievementCache setObject:achievement forKey:achievement.identifier];
    }

    if (achievement) {
        NSLog(@"Submit the Achievement...");
        [achievement reportAchievementWithCompletionHandler: ^(NSError *error) {
            [self callDelegateOnMainThread:@selector(achievementSubmitted:error:) withArg:achievement error:error];
        }];
    }
}
}
Другие вопросы по тегам