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
,并设置一个接受viewController
和error
的闭包。如果viewController
不是nil
,你应该保存它并在适当的时候呈现给用户。
我将他们的示例复制/粘贴到我自己的应用程序中,我看到的行为完全不同。
在设置关闭后立即呈现标准的 Game Center UI,而不是给我稍后呈现的视图控制器。此时我的关闭尚未调用。然后,在登录或点击“取消”后,Game Center UI 将被关闭。此时调用闭包。 error
正确反映了用户是否登录。但无论哪种情况,viewController
始终是 nil
。
如果我在点击“取消”后重新启动应用程序,系统似乎会记住我取消了。然后不显示 UI,调用闭包时,viewController
仍然是 nil
,error
不是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(游戏中心)对本地玩家进行身份验证
在 UITabBarController 之前呈现登录视图控制器