【发布时间】: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,则不会调用处理程序。而是显示登录表,如果您已经在显示视图,则可能会失败。
标签: ios swift swiftui game-center gamekit