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



根据苹果的文档,您应该在应用程序启动时设置GKLocalPlayer.local.authenticateHandler,并使用接受viewControllererror的闭包。如果viewController不是nil,您应该保存它,并在适当的时候将其呈现给用户。

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

没有给我一个视图控制器,稍后在设置关闭后立即显示,而是显示了标准的Game Center UI。在这一点上,我还没有结束。然后在登录或点击"登录"之后;取消";,Game Center UI被解除。此时,调用闭包。error正确地反映了用户是否登录。但在任何一种情况下,viewController总是nil

如果我在点击";取消";,系统似乎记得我取消了。然后不显示UI,并且调用闭包,viewController仍然是nilerror是非nil

这种行为对我来说是不可取的,原因有两个:

  1. 我想在应用程序发布时设置此关闭,但我不希望UI立即出现(就像苹果在其文档中建议的那样(
  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正常吗,而苹果只是没有更新他们的文档?还是我做错了什么?

是的,我也认为苹果文档在这一点上令人困惑("出示视图控制器,以便玩家登录。"(我认为你不需要(或者可以?(;捕获";查看控制器,并将其保存以备以后使用。因此,当/如果你想登录游戏中心,你可以拨打以下

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

这不需要在应用程序发布时发生。并且CCD_ 15闭合可以是空的。

最新更新