MacOS 10.15: GKMatchmaker не находит совпадения со случайным партнером

Следующий код хорошо работает с MacOS 10.14 (Mojave) для случайного партнера, но не работает для приглашенного игрока (приглашения не приходят). В MacOS 10.15 (Catalina) наоборот: он работает с приглашенными игроками, но не может найти совпадение для случайного партнера. В моем случае "случайный" партнер находится на iPhone под управлением iOS 13. Приложения для MacOS и iOS связаны в AppStore.

Пытался GKMatchmaker.shared() или местный GKMatchmaker. Пыталсяrecipients = nil and Recepients = [] Что бы я ни делал с Mac 10.15, со случайным партнером он ведет себя одинаково: findMatch не вызывает обработчик завершения, пока я не скажу gkMatchmaker.cancel(), после чего обработчик завершения для findMatch вызывается с ошибкой -2.

Я поставил точки останова в местах, отмеченных /* BP */. ОК означает, что управление доходит, Никогда - код никогда не достигается. NetCommunicator и AgkPeerInvitationResponseProcessor - это мои собственные классы ("Agk" для Apple Game Kit), смысл которых должен быть ясен.

//========================================================================================
// peer == nil for a random peer
func startMatchmaking(_ peer: GKPlayer?, _ responseProcessor: AgkPeerInvitationResponseProcessor?) {
    /* BP. OK */
    let request = GKMatchRequest()
    request.minPlayers = 2   // Including me
    request.maxPlayers = 2   // Including me
    request.defaultNumberOfPlayers = 2

    if let peer = peer {
        request.recipients = [peer]
    } else {
        request.recipients = nil
        // Tried also request.recipients = []
    }

    request.recipientResponseHandler = { peer, response in
        /* BP. Never */
        guard let processor = responseProcessor else {return}
        switch response {
            case .accepted:
                processor.agkInvitationAccepted(self, peer)
                break

            case .declined:
                processor.agkInvitationDeclined(self, peer)
                break

            default:
                let error = NetCommunicator.makeError(code: .PeerInvitationError, description: "\(response) (\(response.rawValue))")
                processor.agkInvitationError(self, peer, error)
                break;
        }
    }

    /* BP. OK */
    let matchmaker = GKMatchmaker.shared()
    // Tried also let matchmaker = GKMatchmaker(); self.matchmaker = matchmaker 
    matchmaker.findMatch(for: request, withCompletionHandler: {match, error in
        /* BP. Reached not until
           GKMatchmaker.shared().cancel() or self.matchmaker.cancel() is called
           Error -2 is reported on reach */
        if let error = error {
            self.delegate?.sessionError(self, error)
        } else
        if let match = match {
            self.session = match
            match.delegate = self
        }
    })

}

0 ответов

Другие вопросы по тегам