2017-02-28 129 views
1

在我的游戏中,我不希望GameCenter登录弹出窗口在应用启动时自动出现。相反,我有一个GameCenter按钮,用户可以点击登录。当他们按下按钮时,会出现登录屏幕。GameCenter - 登录用户(如果他们已经输入了凭据)

但是,似乎在登录后再次启动应用程序时,用户仍然没有“登录”。他们仍然必须再次按下按钮,然后出现一个小横幅,标题为“欢迎回来,用户!”。有没有办法自动重新登录用户,而不必每次都按下按钮?我已经输入了我的凭证,为什么我必须再次验证身份?

这里是我的代码,当用户按下按钮:

self.authenticatePlayer() 

而这里的身份验证方法:

func authenticatePlayer() { 
     let localPlayer = GKLocalPlayer.localPlayer() 
     localPlayer.authenticateHandler = { 
      (view, error) in 

      if view != nil { 
       self.view?.window?.rootViewController?.presentViewController(view!, animated: true, completion: nil) 
      } else { 

      } 
     } 
    } 

我需要的东西,如果他们已经登录,可以迎回用户,但是如果他们还没有登录,不要求他们登录。

+0

你可以尝试保存在按钮点击时在userDefault中输入名称,然后检查您的userDefault键是否在尝试重新登录后保存了任何用户名。 –

+0

@TusharSharma我对你的意思很抱歉有点困惑。今天刚开始使用GameCenter。我很熟悉保存数据,虽然 – Brejuro

+0

我mwan说当你的用户登录时,你可以保存它的状态。如果它再次登录,则再次检查它,然后相应地创建您的条件。 –

回答

1

要了解您所看到的行为,我们需要了解身份验证过程如何工作。

它在您设置身份验证处理程序时开始。这是告诉您的应用尝试与Game Center对话的信号。认证处理程序的完成模块有三种可能的情况:

  1. 错误:出事了
  2. 接收一个视图控制器:登录视图控制器告诉各位玩家是不是在
  3. 接收零视图控制器记录:缺少错误+缺少视图控制器会告诉您玩家已经登录。

尽管IOS可能知道您的登录状态(或尝试使用缓存信息来伪造您的登录状态),但您的应用当你退出时会丢失上下文。当您再次启动时,没有尝试设置身份验证处理程序,因此在用户按下按钮之前不会尝试验证身份验证状态,因此您的应用程序不知道用户是否已登录。

我认为下面的方法将变得相当接近你在找什么:

  • 设置认证处理程序,并尽可能早地在你第一次的viewController的viewDidLoad启动认证。尽早按照您的启动顺序进行操作。
  • 如果用户未通过身份验证,您将收到一个登录视图控制器。不要呈现它。相反,保存它。除非用户按下按钮,否则不要呈现它。
  • 如果用户已经登录时,他们将看到尽快迎回消息随着比赛的开始,你就可以继续进行,因为用户是仍然登录。
相关问题