Game Center - обработка неудачных представлений о достижениях? - PullRequest
1 голос
/ 18 июля 2011

Я нуб в игровом центре @ игры в целом.Сейчас я делаю вторую игру и реализовал игровой центр.

Если интернет доступен, проблем нет, все работает хорошо.Но только сейчас я намеренно делаю Интернет недоступным, и когда я получаю достижение, очевидно, что оно не регистрируется в достижении Game Center.

Как и как лучше всего решить эту проблему?

Спасибо ....

Ответы [ 5 ]

2 голосов
/ 18 июля 2011

Вы можете добавить объекты 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 голос
/ 31 марта 2012

Я вижу, что два ответа здесь сосредоточены на конкретных механизмах архивирования недоставленных сообщений о достижениях. Для более общего описания общего подхода вы можете увидеть мой ответ на этот связанный вопрос: Надежный код достижения Game Center

0 голосов
/ 18 февраля 2013

На случай, если кто-нибудь натолкнется на этот вопрос в будущем, у Apple теперь есть пример кода для отправки достижений, который включает способ архивации достижений, которые не удалось отправить (из-за отсутствия сетевого подключения и т. Д.).Вы найдете его в руководстве по программированию Game Center .

0 голосов
/ 22 октября 2012
    // 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];
            }
        }];
    }
}
0 голосов
/ 18 июля 2011

Достижения (и все, что касается игрового центра, такие как обновления списка лидеров) соответствуют NSCoding.Вы можете сохранить их, если получите сообщение об ошибке, отправив их позже.Это то, что Apple рекомендует в своих документах.

Ваше приложение должно обрабатывать ошибки, когда оно не может сообщить о прогрессе в Game Center.Например, возможно, на устройстве не было сети, когда вы пытались сообщить о прогрессе.Правильный способ для вашего приложения обрабатывать сетевые ошибки - сохранить объект достижения (возможно, добавив его в массив).Затем ваше приложение должно периодически пытаться сообщить о прогрессе, пока оно не будет успешно сообщено.Класс GKAchievement поддерживает протокол NSCoding, позволяющий приложению архивировать объект достижения при его перемещении в фоновый режим.

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

...