简介
Game Center所有操作都是针对的本地的用户(local player),所以需要启动的时候验证用户。
验证用户
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
//验证game center 是否登录
//viewController是否为nil是设置中gamecenter是否开关,关闭不为nil,打开为nil
//error 为nil,[[GKLocalPlayer localPlayer] isAuthenticated]为YES,验证成功
localPlayer.authenticateHandler = ^(UIViewController * _Nullable viewController, NSError * _Nullable error) {
NSLog(@"已经授权1,playerID : %@", [GKLocalPlayer localPlayer].playerID);
if ([[GKLocalPlayer localPlayer] isAuthenticated]) {
NSLog(@"已经授权2,playerID : %@", [GKLocalPlayer localPlayer].playerID);
self.succBlock([GKLocalPlayer localPlayer].playerID);
}else if(viewController){
[VC presentViewController:viewController animated:NO completion:nil];
}
else{
if (!error) {
NSLog(@"授权完成");
}else{
NSLog(@"取消授权");
NSLog(@"AuthPlayer error: %@", [error localizedDescription]);
}
}
};
注意的问题:
Game center 通过上面的方法验证,这个其中最重要的就是block中的viewcontroller和error,这两个参数是对这个登陆框的一些操作和状态的显示。
-
viewController 是判断我们在系统设置中是否将Game Center 打开,没打开此时viewController 是有值的,打开了了是没有值的(这里其实就是我们是否在系统中登陆过game center账号)。
viewController 不为nil的情况:
image.png
viewController 为 nil的情况:
image.png -
error 假如为nil,[[GKLocalPlayer localPlayer] isAuthenticated] = YES,此时验证通过。也就是说验证通过的时候viewController = nil, error = nil, [[GKLocalPlayer localPlayer] isAuthenticated] = YES。
-
说一下验证的block,block 只能在进入游戏的时候被第一次调起,之后我们在调用这个方法的时候就已经不能在调起这个block验证了,只能是系统自己调起这个block验证。
流程
1、当游戏进入的时候,我们可以主动调起验证block,假如验证通过,此时会看到上方出现横幅,说已经登陆。
2、当我们的游戏进入后台再进入前台,此时会自动调起block 验证,我们每一次从后台进入前台都会自动调用验证过程
3、我们在游戏中,切到后台将Game Center 关闭,再回到前台调用block 验证的时候,此时viewController 是 nil ,而且此时的error也是nil。假如你再次进入后台再进入前台的时候,此时viewController 不为nil,error为nil,此时就会弹出Game Center的登陆框。(viewController != nil, error = nil, [[GKLocalPlayer localPlayer] isAuthenticated] = NO)
image.png
4、上面,我们弹出登陆框,需要用户登录Game center 的时候,假如用户点击cancel 按钮,此时验证失败,(viewController = nil, error != nil, [[GKLocalPlayer localPlayer] isAuthenticated] = NO),此时有错误码,验证失败,(一个游戏的GameCenter登陆假如连续取消3次,当我们后台没有登陆需要验证的时候也不会再出现上面的验证界面)。
5、假如游戏进行中,我们切到后台之后,切换了GameCenter 账号,此时回调block验证之后,验证成功之后会在上面弹出用户已登陆的横幅,此时的Game Center账户的playerId已经修改.(每个Game Center 的账户的playerId对每个应用都是一样的 )。
网友评论