GameKit 自动呈现身份验证视图控制器,而不是等待我呈现它

Posted

技术标签:

【中文标题】GameKit 自动呈现身份验证视图控制器,而不是等待我呈现它【英文标题】:GameKit presenting authentication view controller automatically instead of waiting for me to present it 【发布时间】:2021-12-05 09:52:04 【问题描述】:

根据Apple's documentation,您应该在应用启动时设置GKLocalPlayer.local.authenticateHandler,并设置一个接受viewControllererror 的闭包。如果viewController不是nil,你应该保存它并在适当的时候呈现给用户。

我将他们的示例复制/粘贴到我自己的应用程序中,我看到的行为完全不同。

在设置关闭后立即呈现标准的 Game Center UI,而不是给我稍后呈现的视图控制器。此时我的关闭尚未调用。然后,在登录或点击“取消”后,Game Center UI 将被关闭。此时调用闭包。 error 正确反映了用户是否登录。但无论哪种情况,viewController 始终是 nil

如果我在点击“取消”后重新启动应用程序,系统似乎会记住我取消了。然后不显示 UI,调用闭包时,viewController 仍然是 nilerror 不是nil

这种行为对我来说是不受欢迎的,原因如下:

    我想在应用启动时设置此关闭,但我不希望 UI 立即呈现(就像 Apple 在其文档中建议的那样)。 如果用户拒绝登录然后想要做一些需要登录的事情,我想在应用程序中显示保存的视图控制器,而不是显示一个提醒他们去设置(这是最我现在可以做,AFAIK)。

对于上下文,我在*** SwiftUI 视图中设置闭包,如下所示:

struct ActiveGamesView: View 
  @State private var isPresentingAuth = false
  @State private var gameCenterAuthVC: UIViewController?
  @State private var gameCenterEnabled = false
  @State private var isMultiplayerGamingRestricted = true
  @State private var isPersonalizedCommunicationRestricted = true

  var body: some View 
    NavigationView 
      VStack 
        Spacer()
        NavigationLink(destination: Text("This is the online play area")) 
          Text("Play Online")
        
      
    
    .onAppear() 
      authenticateGameCenter()
    
    .fullScreenCover(isPresented: $isPresentingAuth) 
      GameCenterAuthView(underlyingViewController: gameCenterAuthVC!)
      // This is a UIViewControllerRepresentable that just presents gameCenterAuthVC.
    
  

  private func authenticateGameCenter() 
    gameCenterAuthVC = viewController
    isPresentingAuth = viewController != nil
    gameCenterEnabled = error == nil
    isMultiplayerGamingRestricted = GKLocalPlayer.local.isMultiplayerGamingRestricted
    isPersonalizedCommunicationRestricted = GKLocalPlayer.local.isPersonalizedCommunicationRestricted
  

鉴于当前的意外行为,正如预期的那样,我的 fullScreenCover 闭包永远不会被调用,所以我保存的 gameCenterAuthVC 永远不会被呈现。

我的问题是:这种自动呈现的 UI 是否正常,而 Apple 只是没有更新他们的文档?还是我做错了什么?

【问题讨论】:

这看起来像一个错误,或者至少与文档所说的不同。根据Authenticating a Player 文档,即使登录也应调用处理程序:“如果本地玩家需要执行某些操作,GameKit 会传递一个视图控制器,您必须将其呈现给玩家以完成身份验证。”。但如果用户尚未登录且未启用 Game Center,则不会调用处理程序。而是显示登录表,如果您已经在显示视图,则可能会失败。 【参考方案1】:

是的,我还认为苹果文档在这一点上令人困惑(“呈现视图控制器以便玩家可以登录。”)我认为您不需要(或可以?)“捕获” viewController 并将其保存以备后用。因此,当/如果您想登录 Game Center 时,请调用以下命令

GKLocalPlayer.local.authenticateHandler =  viewController, error in

这不需要在应用启动时发生。 authenticateHandler 闭包可以为空。

【讨论】:

以上是关于GameKit 自动呈现身份验证视图控制器,而不是等待我呈现它的主要内容,如果未能解决你的问题,请参考以下文章

无法在 watchOS 上使用 GameKit(游戏中心)对本地玩家进行身份验证

以模态方式呈现视图控制器时,导航栏与黑色而不是白色混合

添加 GameKit 后视图控制器未释放

在 UITabBarController 之前呈现登录视图控制器

在UITabBarController之前呈现Login View Controller

通过模态视图呈现详细视图控制器 [关闭]