问题
验证了本地玩家,你还需要获得他的别名和其它一些信息。
解决方案
使用GKLocalPlayer的各个有效属性,如alias。
讨论
GKPlayer对象表示游戏中心中的玩家。每个玩家拥有一些非常重要的属性:
playerID:
玩家标识。该标识不应当显示给玩家。在排行榜中,玩家希望看到的是别名。在许多游戏中心方法中,我们首先要能够获取玩家的ID,并使用它们加载玩家的其它信息,比如某特定排行榜中的成绩。换句话说,仅当和游戏中心API打交道时玩家ID才会重要。
alias:
在游戏中心注册过程中玩家设置的别名。
isFriend:
该属性返回一个BOOL类型的值。它用来决定该玩家是否是当前已通过验证的本地玩家的好友。
该属性仅在GKPlayer中有效。虽然GKLocalPlayer是GKPlayer的子类,但它不能访问isFriend。
此处是获取本地玩家信息的演示代码。在该代码中,我想要演示的东西分为两个部分,每个部分都用块对象表示。其中的一个块对象简单地用来打印本地玩家的别名和玩家ID:
void (^printLocalPlayerInfo)(void) = ^{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
if ([localPlayer isAuthenticated] == YES){
NSLog(@"Player ID = %@", [localPlayer playerID]);
NSLog(@"Player Alias = %@", [localPlayer alias]);
}
};
第二个块对象作出验证,然后调用第一个块对象。
- (void) authenticateLocalPlayerAndGetHerInfo{
dispatch_queue_t concurrentQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^(void) {
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
if ([localPlayer isAuthenticated] == NO){
[localPlayer authenticateWithCompletionHandler:^(NSError *error) {
if (error == nil){
NSLog(@"Successfully authenticated.");
dispatch_async(concurrentQueue, printLocalPlayerInfo);
} else {
NSLog(@"Failed to authenticate. Error = %@", error);
}
}];
} else {
dispatch_async(concurrentQueue, printLocalPlayerInfo);
}
});
}
直白又简单!如果我调用authenticateLocalPlayerAndGetHerInfo方法,将打印下面的信息到控制台:
Successfully authenticated.
Player ID = G:1428628142
Player Alias = Test Game User 1
该信息仅当本地玩家已经通过验证才会输出到控制台。如果玩家还没有登录,则会提示玩家进行登录。如果玩家故意不登录或未能成功登录,则打印出错信息。
本地玩家(GKLocalPlayer),和其它玩家(GKPlayer)不同,拥有一个叫作friends的属性,它定义了本地玩家的朋友信息。关于它的更多信息,参考条款1.8。