Рейтинг GKScore всегда равен 0
Я близок к завершению моего первого приложения, которое использует (и требует) 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);
}];
... ошибка не возникает и вывод:
Score: <GKScore: 0x361a3c0><0x361a3c0> player=G:1127411264 rank=0 date=2012-02-04 22:19:52 +0000 value=2200002 formattedValue=(null) context=(null)
Score: 0
Может быть, мне чего-то не хватает в iTunesConnect? Будет ли работать ранг, как только я выйду из песочницы? Любые указатели в правильном направлении будут оценены.
4 ответа
В вашем коде нет ошибки. Значение ранга всегда 0, если вы просто создаете объект GKScore. Он действителен только для объектов, полученных из Game Center. Пожалуйста, прочтите этот документ: https://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKScore_Ref/Reference/Reference.html
Вам нужно преобразовать целое число в int64_t
, С точки зрения Objective-C это LongLong
, Вы можете изменить это:
GKScore *myScore = [[GKScore alloc]initWithCategory:@"1"];
myScore.value = [[NSNumber numberWithInt:score] longLongValue]; //score should be of type int
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);
}
}
}];
Пожалуйста, попробуйте это, и дайте мне знать, если это работает для вас.
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;