Рейтинг GKScore всегда 0 - PullRequest
       4

Рейтинг GKScore всегда 0

2 голосов
/ 05 февраля 2012

Я близок к завершению моего первого приложения, которое использует (и требует) Game Center. Я не делаю достижения, просто система рекордов. У меня все подключено, мое приложение зарегистрировано в iTunesConnect с включенным Game Center, и когда я регистрирую рекорд, оно появляется в списке, как и должно быть.

Единственное, что не работает, это "звание". В блоке завершения [GKScore reportScoreWithCompletionHandler:] свойство rank моего объекта GKScore всегда равно 0, даже если пользователь получил новый высокий балл.

Например, в моем приложении, когда я запускаю:

GKScore *scoreReporter = [[GKScore alloc] initWithCategory:@"1"];
scoreReporter.value = 2200003; // test value
[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {

    if (error != nil)
    {
        NSLog(@"An error occured reporting the Game Center score: %@", error);
    }

    NSLog(@"Score: %@", scoreReporter);
    NSLog(@"Score: %d", scoreReporter.rank);
}];

... ошибки не возникает и вывод:

* * 1010

Может быть, мне чего-то не хватает в iTunesConnect? Будет ли работать ранг, как только я выйду из песочницы? Будут оценены любые указатели в правильном направлении.

Ответы [ 4 ]

3 голосов
/ 14 февраля 2012

В вашем коде нет ошибок.Значение ранга всегда 0, если вы просто создаете объект GKScore.Он действителен только для объектов, полученных из Game Center.Пожалуйста, прочитайте этот документ: https://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKScore_Ref/Reference/Reference.html

1 голос
/ 11 июля 2012

Вам нужно преобразовать целое число в int64_t.В терминах Objective-C это LongLong.Вы можете изменить это:

GKScore *myScore = [[GKScore alloc]initWithCategory:@"1"];
myScore.value = [[NSNumber numberWithInt:score] longLongValue]; //score should be of type int
1 голос
/ 20 февраля 2012

laxcat, Вы не можете сразу получить ранг только что добавленной оценки, но по прошествии некоторого времени вы можете выполнить запрос на получение рейтинга пользователя:

GKLeaderboard *lb = [[[GKLeaderboard alloc] init] autorelease];
lb.category = @"YOURLeaderBoardID";
lb. timeScope = GKLeaderboardTimeScopeToday;
[lb loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) 
                                {
                                     GKLocalPlayer *lp = [GKLocalPlayer localPlayer];
                                     for (GKScore* score in scores)
                                     {
                                         if ([score.playerID sEqualToString:lp.playerID])
                                         {
                                             NSLog(@"rank = %d", score.rank);
                                         }
                                     }
                                }];

Пожалуйста, попробуйте это, и дайте мне знать, если это работает для вас.

0 голосов
/ 28 сентября 2016

OBJ-C с включенным ARC - получение ранга игрока в таблице лидеров Нет необходимости перебирать счет, просто получить прямой доступ через [YourAllocatedLeaderBoard] .localPlayerScore.rank (в обработчике завершения)

GKLeaderboard *leaderBoard = [[GKLeaderboard alloc]init];
    [leaderBoard setIdentifier:@"yourLeaderboardID"];
    [leaderBoard setTimeScope:GKLeaderboardTimeScopeAllTime];

    [leaderBoard loadScoresWithCompletionHandler:^(NSArray<GKScore *> * _Nullable scores, NSError * _Nullable error) {
        if (!error) {
            NSLog(@"RANK %d",(int)leaderBoard.localPlayerScore.rank);

        }else{
            NSLog(@"*error* %@",error.localizedDescription);

        }
    }];

    leaderBoard = nil;
...