Аутентификация SwiftUI Game Center не предлагает пользователю войти в систему
У меня есть приведенный ниже код для аутентификации локального игрока в Game Center в моем приложении 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 где-то в моем классе для интеграции ViewController UIKit в SwiftUI, но я не понимаю, как я могу его использовать. Кто-нибудь может мне помочь?
2 ответа
Я не заставил кого-нибудь правильно ответить на мой вопрос, и после нескольких дней копания я нашел решение. Поэтому мне пришлось использовать реализацию UIKit, как показано ниже, и создать вокруг нее оболочку с помощью UIViewControllerRepresentable в GameCenterManager Struct. После этого все, что мне нужно было сделать, это вызвать GameCenterManager() в моем представлении SwiftUI в ZStack, и работа сделана!
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)
}
}
}
}