You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:38:39