2012-02-04 2 views
2

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

Единственное, что не работает, это «ранг». В блоке завершения [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? Будет ли ранг начать работать, как только я покину песочницу? Любые указатели в правильном направлении будут оценены.

ответ

3

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

+0

Это правильно. Я, конечно же, прочитал эту документацию, но почему-то неверно истолковал «Значение этого свойства не определено на вновь инициализированном объекте GKScore, оно действительно только для объектов очков, полученных от Game Center». означает, что ранг будет заполнен в блоке завершения. Конечно, это означает, что если вы создали GKScore, ранг будет всегда равным 0. Вопрос все еще остается: «Как вы получаете ранг оценки, которую вы только что опубликовали?» Возможно, я задам еще один вопрос, задающий конкретный вопрос. – laxcat

0

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); 
             } 
            } 
           }]; 

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

1

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

GKScore *myScore = [[GKScore alloc]initWithCategory:@"1"]; 
myScore.value = [[NSNumber numberWithInt:score] longLongValue]; //score should be of type int 
0

OBJ-C с ARC включен - получение звания для игрока в Leaderboard Там нет необходимости перебрать оценки, просто получить доступ непосредственно через [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;