Следующий код хорошо работает с 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
}
})
}