Аутентификация 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)
            }
        }
    }
}
Другие вопросы по тегам