GameCenter multijugador atascado en "Starting Game …"

Actualmente estoy trabajando en mi juego y he decidido habilitar el modo multijugador a través de GameCenter en el juego para permitir que los usuarios jueguen con sus amigos. He seguido un tutorial de RayWinderLinch , pero encontré un problema.

Mi problema es que cuando GKMatchMakingViewController el GKMatchMakingViewController y GKMatchMakingViewController el button grande de Play Now en ambos dispositivos se encontrarán entre sí (lo que está previsto que ocurra) y bajo el nombre de usuario del centro de juego, dirá Ready .

Esto significa que GameCenter ha encontrado a cada jugador y está listo para comenzar el partido como debería, pero en mi caso el partido nunca comienza. Está atrapado en un ciclo que dice Starting Game... y no pasa nada. Parece que el

func matchmakerViewController(viewController: GKMatchmakerViewController!, didFindMatch theMatch: GKMatch!)

y el

func match(theMatch: GKMatch!, player playerID: String!, didChangeState state: GKPlayerConnectionState)

los methods nunca se ejecutan. Estoy completamente perdido en lo que está sucediendo. He intentado esto muchas veces para solucionar el problema, pero nada funcionó. Adjuntaré una image que muestra la pantalla de la aplicación donde mi problema persiste y adjuntaré el código que estoy usando.

Estoy usando un framework basado en GameKitHelper.h en el tutorial mencionado anteriormente. Está escrito en swift y se llama GCHelper

Código

El código de GCHelper se puede encontrar utilizando el enlace de GitHub mencionado anteriormente

He cortado el código que es innecesario para este problema

  class GameScene : SKScene, GameKitHelper, MultiplayerNetworkingProtocol { override func didMoveToView () { GCHelper().authenticateLocalUser() //Authenticate GameCenter User println("\n \n \n Authenticating local user \n \n \n") } func startMultiplayer () { var vc = self.view?.window?.rootViewController GameKitHelper().findMatchWithMinPlayers(2, maxPlayers: 2, viewController: vc!, delegate: self); //Find match and load GKMatchMakerViewController } func matchStarted() { //Delegate method println("match started") } func matchEnded() { //Delegate method println("match ended") } func match(match: GKMatch, didReceiveData: NSData, fromPlayer: String){ //Delegate Method println("Did receive data") } override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { for touch in (touches as! Set<UITouch>) { let location = touch.locationInNode(self) if self.nodeAtPoint(location) == multiplayer //SKSpriteNode { //User clicked on multiplayer button, launch multiplayer now! println("Loading multiplayer") startMultiplayer() } } 

Imagen

El centro de juego encuentra a cada jugador y está listo para comenzar la partida, pero luego se queda atascado en el Juego inicial ...

ACTUALIZAR

He notado que cuando pruebo usando mi iPhone y el simulador, en el iPhone el estado pasará de Ready a Disconnected pero en el simulador el estado sigue Ready y luego recibiré el siguiente post en la console para el iPhone

Advertencia matchmakerViewController: didFindMatch: método delegado no implementado`

Aunque está implementado en el file GCHelper.swift . Esto no sucede cuando pruebo en mi iPhone y iPad Mini, simplemente sigue diciendo Starting Game...

Cualquier ayuda será apreciada.

Requisitos previos

  • Ambos jugadores deben estar en el mismo entorno ( Sandbox para testings).
  • La authenticationChanged GCHelper.swift en GCHelper.swift no debe ser private . Es posible que tenga que eliminar esa palabra key.

Sandbox Player

Hay algunos delegates involucrados, y en su ejemplo, hay algunos protocolos que compiten entre sí. Mi recomendación es crear una nueva aplicación con un código minimalist para rastrear el problema startMultiplayer .

Tutorial paso a paso de Gamekit Multi Player usando GCHelper

Cree un nuevo proyecto (Xcode> Archivo> Nuevo> Proyecto …> Aplicación de Vista única> …> Crear) usando el mismo nombre de producto y nombre de la organización como su juego, para que coincida con el identificador de package de aplicaciones y el juego de iTunes Parámetros centrales . Esto le permitirá ejecutar testings sin sobrecarga.

Utilice este Podfile:

 platform :ios, '8.0' use_frameworks! target 'SO-31699439' do pod 'GCHelper' end 

Use un GCHelperDelegate

Cree un UIViewController con solo el mínimo necesario (un button Iniciar multijugador ) y conéctelo a esta acción:

 @IBAction func startMultiplayerAction(_ sender: AnyObject) { GCHelper.shanetworkingInstance.findMatchWithMinPlayers( 2, maxPlayers: 2, viewController: self, delegate: self); } 

Aquí está el quid: el delegado que pase debe adoptar GCHelperDelegate . No tiene que ser la misma class, pero en el ejemplo anterior está, y la regla actual no se respetó. Para este ejemplo, ViewController adopta GCHelperDelegate :

 import UIKit import GCHelper import GameKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() GCHelper.shanetworkingInstance.authenticateLocalUser() } } 

Implementar los methods requeridos de GCHelperDelegate en una extension

Dado que ViewController adopta GCHelperDelegate , los tres methods siguientes deben estar en esa misma class y se invocarán:

 extension ViewController: GCHelperDelegate { func matchStarted() { print("matchStarted") } func match(_ match: GKMatch, didReceiveData: Data, fromPlayer: String) { print("match:\(match) didReceiveData: fromPlayer:\(fromPlayer)") } func matchEnded() { print("matchEnded") } } 

Ejecución

Probado: construido, vinculado, ejecutado, coincidencia exitosa.

Inicie la aplicación, pulse el button Iniciar multijugador , toque Reproducir ahora en ambos dispositivos (o iPhone Simulator + dispositivo real).

Reproducir ahora

Iniciar session:

 Authenticating local user... Authentication changed: player not authenticated Ready to start match! Found player: SandboxPlayer matchStarted 

► Encuentra esta solución en GitHub y detalles adicionales sobre Swift Recipes .