Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI游戏中心认证不存在';t提示用户登录_Swift_Swiftui_Game Center_Gamekit_Uiviewcontrollerrepresentable - Fatal编程技术网

SwiftUI游戏中心认证不存在';t提示用户登录

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

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

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这是一个非常有用的博客。当我无法发送和接收邀请时,它帮助了我