我正在尝试将Game Center应用到我的应用中,以下代码报告得分。
我正在尝试完成一个解决方案,如果播放器未经过身份验证,则应通过scoreReporter块将得分保存在scoreDictionary中。但是,当播放器未经过身份验证时,它永远不会出现“If(error!= nil)”语句。
事实上,它通过整个街区。如果本地播放器已通过身份验证,则执行该块。
这是我第一次详细研究Game Center和Block,所以我在这里有点迷失。
我想要完成的是如上所述。
我使用5.1作为目标。
-(void)reportScore:(int64_t)score forCategory:(NSString*)category {
NSLog(@"reportScore: %lli", score);
NSLog(@"category: %@",category);
GKScore *scoreReporter = [[GKScore alloc] initWithCategory:category];
scoreReporter.value = score;
NSLog(@"scoreReporter: %@", scoreReporter);
[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
NSLog(@"Execute the scoreReporter the block");
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *scoreFilePath = [NSString stringWithFormat:@"%@/scores.plist",[paths
objectAtIndex:0]];
NSMutableDictionary *scoreDictionary=[NSMutableDictionary
dictionaryWithContentsOfFile:scoreFilePath];
if (error != nil)
{
//There was an error so we need to save the score locally and resubmit later
NSLog(@"Saving score for later");
[scoreDictionary setValue:scoreReporter forKey:[NSDate date]];
[scoreDictionary writeToFile:scoreFilePath atomically:YES];
}
}];
}
播放器未经过身份验证时的NSLog输出:
reportScore: 80
category: com.xxxxxx.yyyyyyyHighScore
scoreReporter: <GKScore: 0xab611b0>player:(null) rank:0 date:2012-12-19 11:18:04 +0000 value:80 formattedValue:(null) context:0x0
验证播放器时NSLog输出:
reportScore: 60
category: com.xxxxxx.yyyyyyyHighScore
scoreReporter: <GKScore: 0x964ce30>player:G:280817155 rank:0 date:2012-12-19 11:27:45 +0000 value:60 formattedValue:(null) context:0x0
Execute the scoreReporter the block
答案 0 :(得分:0)
游戏中心编程指南说&#34;大多数游戏中心类只有在有经过身份验证的玩家时才会起作用,并且这些类隐含地引用本地玩家。例如,当您的游戏向排行榜报告分数时,它总是报告本地玩家的分数。如果没有经过身份验证的播放器,您的游戏必须禁用所有Game Center功能。&#34;
可能发生的事情是reportScoreWithCompletionHandler:根本没有运行,因此它没有完成&#34;因此它不会调用completionHandler。在reportScoreWithCompletionHandler之前测试经过身份验证的播放器:如果/ else,GameKit代码通常会出现以下几种情况:
if ( [GKLocalPlayer localPlayer].authenticated ) {
...
} else {
...
}