【问题标题】:GameKit presenting authentication view controller automatically instead of waiting for me to present itGameKit 自动呈现身份验证视图控制器,而不是等待我呈现它
【发布时间】: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

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

  1. 我想在应用启动时设置此关闭,但我不希望 UI 立即呈现(就像 Apple 在其文档中建议的那样)。
  2. 如果用户拒绝登录然后想要做一些需要登录的事情,我想在应用程序中显示保存的视图控制器,而不是显示一个提醒他们去设置(这是最我现在可以做,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,则不会调用处理程序。而是显示登录表,如果您已经在显示视图,则可能会失败。

标签: ios swift swiftui game-center gamekit


【解决方案1】:

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

GKLocalPlayer.local.authenticateHandler = { viewController, error in
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多