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
}
})
}