The following code works well with MacOS 10.14 (Mojave) for a random peer, however doesn't work for an invited player (invitations don't arrive). With MacOS 10.15 (Catalina) it's vice versa: it works with invited players, however doesn't find a match for a random peer. In my case the 'random' peer is on iPhone running iOS 13. The MacOS and iOS apps are linked in the AppStore.
Tried GKMatchmaker.shared() or local matchmaker. Tried recipients = nil and recepients = [] Whatever I do with Mac 10.15 behaves in same way: findMatch doesn't calls completion handler until I say gkMatchmaker.cancel(), after which the completion handler for findMatch is called with error -2.
I've put breakpoints at the places marked /* BP */. OK means that the control gets there, Never - code is never reached.
NetCommunicator and AgkPeerInvitationResponseProcessor are my own classes ('Agk' for Apple Game Kit) the meaning of which should be clear.
/* peer = nil. for a random peer */
func startMatchmaking(_ peer: GKPlayer?, _ responseProcessor: AgkPeerInvitationResponseProcessor?) {
let request = GKMatchRequest(). /* BP. OK */
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: Only after GKMatchmaker.shared().cancel() or self.matchmaker.cancel() with error */
if let error = error {
self.delegate?.sessionError(self, error)
} else
if let match = match {
self.session = match
match.delegate = self
}
})
}