MacOS 10.15: GKMatchmaker не находит совпадений со случайным пером - PullRequest
0 голосов
/ 28 января 2020

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

Пробный GKMatchmaker.shared() или локальный GKMatchmaker. Пробовал recipients = nil и recepients = [] Что бы я ни делал с Ma c 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
        }
    })

}
...