【发布时间】:2016-05-13 15:55:52
【问题描述】:
我在有关堆栈溢出的帖子中看到了处理 GameCenter 身份验证的 sn-ps。但是,这些解决方案都没有解决现实世界用例涵盖的任何问题。即 [GKLocalPlayer localPlayer].authenticateHandler 只是一个状态的回调,并没有什么其他的。它提供了一个视图控制器,但 .authenticated 和错误状态存在大量不一致。
我正在尝试做一些事情: 1. 游戏中心登录不弹出,直到某个功能使用它 2. 尝试在应用启动时静默进行身份验证 3. 向用户提供一些 GameCenter 功能无法正常工作的信息 4. 提供恢复机制
也就是说,如果报告了错误,我该如何显示登录对话框?
我在没有 viewController 的情况下收到此错误:
案例一:
GameCenterManager::authenticateLocalPlayer 中的错误 [Internet 连接似乎处于脱机状态。]
尽管有错误消息,但设备完全在线,因为 safari 可以正常加载 cnn.com。
案例 2:
有人因为没有准备好而关闭了登录屏幕,在这种情况下 .authenticated 返回为真,viewController 保持为零,但所有游戏中心调用都将失败。为什么 [GKLocalPlayer localPlayer].authenticated 设置为 true 而不是?
案例3:
GameCenterManager::authenticateLocalPlayer 中的错误 [操作 无法完成。 (NSURLErrorDomain 错误 -1009.)]
这种情况一直在发生,但应用程序无法为用户做任何事情。在这种情况下,消息应该是什么?将应用切换到 Game Center 并在那里登录?
案例 4:
GameCenterManager::authenticateLocalPlayer 中的错误 [请求的 操作已被用户取消或禁用。]
如果用户取消了苹果告诉应用程序呈现的 viewController,就会发生这种情况。然而,也没有恢复或检测到这种状态。
案例 5:
GameCenterManager::createMatch 中的错误 [请求的操作可能 未完成,因为本地播放器尚未经过身份验证。]
如果用户已登录,但出于某种原因从 GameCenter 注销然后返回到应用程序,就会发生这种情况。应用程序将被告知用户仍然经过身份验证,但显然未通过身份验证,但我无法调用其他登录信息。
所以本质上,如果 GameCenter 不只是默默地工作,那么作为应用设计师,我们该怎么办?警报视图并告诉他们使用游戏中心应用程序登录并重新启动应用程序?
这是我的验证码:
//******************************************************
// Authenticate
//******************************************************
-(void)authenticateLocalPlayer:(bool)showLogin
{
if( showLogin && self.loginScreen != nil )
{ [[WordlingsViewController instance] presentViewController:self.loginScreen animated:YES completion:nil]; }
if( [GKLocalPlayer localPlayer].isAuthenticated )
{
NSDLog(NSDLOG_GAME_CENTER,@"GameCenterManager::authenticateLocalPlayer LocalPlayer authenticated");
}
__weak GameCenterManager* weakSelf = self;
[GKLocalPlayer localPlayer].authenticateHandler = ^(UIViewController *viewController, NSError *error)
{
if (error != nil)
{
NSDLog(NSDLOG_GAME_CENTER,@"Error in GameCenterManager::authenticateLocalPlayer [%@]", [error localizedDescription]);
}
else
{
if (viewController != nil)
{
NSDLog(NSDLOG_GAME_CENTER,@"GameCenter: No authentication error, but we need to login");
weakSelf.loginScreen = viewController;
}
else
{
if ( [GKLocalPlayer localPlayer].authenticated )
{
NSDLog(NSDLOG_GAME_CENTER,@"GameCenter localPlayer authenticated");
weakSelf.gameCenterAvailable = YES;
weakSelf.localPlayer = [GKLocalPlayer localPlayer];
[weakSelf retrieveFriends];
[weakSelf loadPlayerPhoto:weakSelf.localPlayer];
for ( id<GameCenterDelegate> listener in weakSelf.listeners )
{ [listener onPlayerAuthenticated]; }
}
else
{
weakSelf.gameCenterAvailable = NO;
}
}
}
};
}
这个函数被调用了两次:一次是在应用程序启动时创建一个有效的登录状态,第二次如果用户没有通过身份验证并且他们尝试使用需要游戏中心的应用程序功能。在这个应用程序中,它正在创建回合制比赛或查看朋友
【问题讨论】:
标签: game-center