如何在GameKit中登录访客玩家并实现在线多人匹配?
问题:如何通过匿名访客玩家实现无需Game Center登录的在线匹配?
我希望用户不想使用Game Center登录时仍能在线游玩,因此尝试通过匿名/访客玩家实现该功能,代码如下:
GKLocalPlayer.local.authenticateHandler = { viewController, error in if let viewController { self.present(viewController, animated: true) } else { self.dismiss(animated: true) // 创建访客玩家(当用户取消登录视图控制器时触发,实际游戏中有按钮逻辑,这里简化展示) if error != nil { GKLocalPlayer.anonymousGuestPlayer(withIdentifier: UUID().uuidString) } let request = GKMatchRequest() request.minPlayers = 2 request.maxPlayers = 4 let matchmakerVC = GKMatchmakerViewController(matchRequest: request)! matchmakerVC.matchmakerDelegate = self GKLocalPlayer.local.register(self) self.present(matchmakerVC, animated: true) } }
然而,当使用GKLocalPlayer.anonymousGuestPlayer(withIdentifier: UUID().uuidString)创建访客玩家时,手机上会弹出提示“Multiplayer Unavailable. Player is not signed in.”。请问如何登录访客玩家并允许进行在线匹配?
解决方案
你的代码仅创建了匿名访客玩家实例,但未完成认证流程,也未将该实例设为当前活跃本地玩家,导致GameKit判定玩家未登录,无法启动多人匹配。按以下步骤修改即可解决:
1. 完成匿名玩家的认证
创建匿名玩家后,必须调用其authenticate方法完成认证,等待认证成功后再发起匹配请求。
2. 调整逻辑,等待认证回调
将匹配逻辑移至匿名玩家的认证回调中,确保只有认证完成后才进入匹配流程。
修改后的代码示例
GKLocalPlayer.local.authenticateHandler = { viewController, error in if let viewController { self.present(viewController, animated: true) } else { self.dismiss(animated: true) // 处理登录失败(如用户取消Game Center登录) if error != nil { // 创建匿名访客玩家 let guestPlayer = GKLocalPlayer.anonymousGuestPlayer(withIdentifier: UUID().uuidString) // 执行匿名玩家认证 guestPlayer.authenticate { authError in guard authError == nil else { // 处理匿名认证失败逻辑 print("匿名玩家认证失败:\(authError?.localizedDescription ?? "未知错误")") return } // 认证成功,设置当前活跃玩家并发起匹配 GKLocalPlayer.local = guestPlayer GKLocalPlayer.local.register(self) let request = GKMatchRequest() request.minPlayers = 2 request.maxPlayers = 4 let matchmakerVC = GKMatchmakerViewController(matchRequest: request)! matchmakerVC.matchmakerDelegate = self self.present(matchmakerVC, animated: true) } } else { // Game Center登录成功的正常匹配逻辑 GKLocalPlayer.local.register(self) let request = GKMatchRequest() request.minPlayers = 2 request.maxPlayers = 4 let matchmakerVC = GKMatchmakerViewController(matchRequest: request)! matchmakerVC.matchmakerDelegate = self self.present(matchmakerVC, animated: true) } } }
关键说明
- 匿名玩家认证完成后,需将
GKLocalPlayer.local设置为该匿名玩家实例,让GameKit识别当前活跃玩家 - 所有匹配相关操作必须在认证成功回调中执行,确保玩家状态有效
- 需处理匿名认证失败的情况(如网络问题),给用户相应反馈
内容的提问来源于stack exchange,提问作者rayaantaneja
相关产品推荐
相关产品推荐

