SwiftUI游戏中心认证不存在';t提示用户登录
我有下面的代码来验证我的SwiftUI应用程序中游戏中心的本地玩家。我希望游戏中心提示用户登录,如果玩家尚未登录,但这不会发生SwiftUI游戏中心认证不存在';t提示用户登录,swift,swiftui,game-center,gamekit,uiviewcontrollerrepresentable,Swift,Swiftui,Game Center,Gamekit,Uiviewcontrollerrepresentable,我有下面的代码来验证我的SwiftUI应用程序中游戏中心的本地玩家。我希望游戏中心提示用户登录,如果玩家尚未登录,但这不会发生 class AppSettings: UINavigationController { func authenticateUser() { let localPlayer = GKLocalPlayer.local localPlayer.authenticateHandler = { vc, error in
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中的内容,但我不明白如何使用它。
有人能帮我吗?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)
}
}
}
}
我没有让任何人正确回答我的问题,经过几天的挖掘,我找到了解决办法。因此,我必须像下面那样使用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>) {
}
}
导入快捷界面
导入UIKit
导入游戏套件
类ViewController:UIViewController{
重写func viewDidLoad(){
super.viewDidLoad()
验证者()
}
让localPlayer=GKLocalPlayer.local
func authenticateUser(){
localPlayer.authenticateHandler={vc,出现错误
保护错误==nil else{
打印(错误?.localizedDescription??)
返回
}
如果vc!=nil{
self.present(vc!,动画:true,完成:nil)
}
如果可用(iOS 14.0,*){
GKAccessPoint.shared.location=.bottomLeading
GKAccessPoint.shared.showHighlights=true
GKAccessPoint.shared.isActive=self.localPlayer.isAuthenticated
//对早期版本的回退
}
}
}
}
结构GameCenterManager:UIViewControllerRepresentable{
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->ViewController{
让viewController=viewController()
返回视图控制器
}
func updateUIViewController(uUIViewController:ViewController,上下文:UIViewControllerRepresentableContext){
}
}
因此,我只是尝试演示ViewController,但当用户从游戏中心注销时,它仍然不会提示用户登录。我使用的是iOS 14,我希望ViewController能够打开Game Center的登录屏幕,这样用户就可以登录了。我需要做些进一步的事情吗?请让我知道@Pawello2222我正在寻找那些代码行。谢谢你,伙计。我目前正在尝试创建一个基于回合的卡片应用程序。你想用哪种应用程序?@Kataran我很高兴你发现这很有用。我正在开发一款实时多人游戏。虽然很琐碎。RockPaperX。我在应用商店已经有了一个单人游戏的工作版本,现在我正在推动多人游戏。你可以在twitter上关注我,这样我们就可以交流想法。我只熟悉SwiftUI。您是如何实现诸如展示成就等功能的。?您是否将其实现到GameCenterManager结构或视图控制器中?@Kataran您可以在新类中实现它们,并从SwiftUI视图调用它们,或在ViewController类中实现它们。我已经在一个新类中实现了它们。@Kataran这是一个非常有用的博客。当我无法发送和接收邀请时,它帮助了我