SwiftUI Game Center身份验证不会提示用户登录

问题描述

我有以下代码在我的SwiftUI应用中的Game Center中对本地玩家进行身份验证。我希望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 Struct中的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,completion: nil)
            }
        }
    }
}