GKScore排名始终为0

时间:2012-02-04 22:41:28

标签: ios game-center

我即将完成第一个使用(并要求)游戏中心的应用程序。我没有取得成就,只是一个高分制度。我已将所有内容都插入,我的应用程序已在iTunesConnect中注册并启用了游戏中心,当我记录高分时,它会显示在列表中。

一件不起作用的是“等级”。在[GKScore reportScoreWithCompletionHandler:]的完成块中,即使用户获得了新的高分,我的GKScore对象的rank属性也始终为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 :(得分:3)

您的代码没有错误。如果您只是创建GKScore对象,则rank的值始终为0。它仅对从Game Center收到的分数对象有效。 请阅读此文档: https://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKScore_Ref/Reference/Reference.html

答案 1 :(得分:1)

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

请尝试这个,并告诉我它是否适合你。

答案 2 :(得分:1)

您需要将整数转换为int64_t。在Objective-C术语中,这是LongLong。你可以改变这个:

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

答案 3 :(得分:0)

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;