SwiftUI 游戏中心身份验证不会提示用户登录



我有下面的代码来验证我的SwiftUI应用程序中Game Center中的本地玩家。我希望游戏中心提示用户登录,如果玩家还没有登录,但这并没有发生。

class AppSettings: UINavigationController {
func authenticateUser() {
let localPlayer = GKLocalPlayer.local
localPlayer.authenticateHandler = { vc, error in
guard error == nil else {
print(error?.localizedDescription ?? "")
return
}
}
}
}

可能是什么问题?我还读过在课堂上的某个地方使用UIViewControllerRepresentable将UIKit的ViewController集成到SwiftUI中的内容,但我不明白如何使用它。有人能帮我吗?

我没有让任何人正确回答我的问题,经过几天的挖掘,我找到了解决方案。因此,我不得不使用下面这样的UIKit实现,并在GameCenterManager结构中使用UIViewControllerRepresentable创建一个包装器。之后,我所要做的就是在ZStack中的SwiftUI视图中调用GameCenterManager((,工作就完成了!

import SwiftUI
import UIKit
import GameKit

class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
authenticateUser()
}
let localPlayer = GKLocalPlayer.local
func authenticateUser() {

localPlayer.authenticateHandler = { vc, error in
guard error == nil else {
print(error?.localizedDescription ?? "")
return
}
if vc != nil {
self.present(vc!, animated: true, completion: nil)
}
if #available(iOS 14.0, *) {
GKAccessPoint.shared.location = .bottomLeading
GKAccessPoint.shared.showHighlights = true
GKAccessPoint.shared.isActive = self.localPlayer.isAuthenticated

// Fallback on earlier versions
}
}
}
}

struct GameCenterManager: UIViewControllerRepresentable {

func makeUIViewController(context: UIViewControllerRepresentableContext<GameCenterManager>) -> ViewController {


let viewController = ViewController()
return viewController

}

func updateUIViewController(_ uiViewController: ViewController, context: UIViewControllerRepresentableContext<GameCenterManager>) {

}

}

authenticateHandler也返回一个您没有使用的UIViewController

@available(iOS 6.0, *)
open var authenticateHandler: ((UIViewController?, Error?) -> Void)?

你需要出示它:

class AppSettings: UINavigationController {
func authenticateUser() {
let localPlayer = GKLocalPlayer.local
localPlayer.authenticateHandler = { vc, error in
guard error == nil else {
print(error?.localizedDescription ?? "")
return
}
if let vc = vc {
self.present(vc, animated: true, completion: nil)
}
}
}
}

最新更新