After some attempts, it seems that the answer to the first part of this question is as follows. As soon as the match is started, even if no one has matched the automatch invitation, the array of participants is populated with as many players as requested (one of which is the inviting player), and every missing player is a GKTurnBasedParticipant whose status is GKTurnBasedParticipantStatusMatching. So, the inviting player could play the first turn even without waiting for the invited (auto-match) players to accept, by simply creating an array of next participants where the inviting player is placed at the end of the array.
NSMutableArray *nextParticipants = [NSMutableArray new];
for (GKTurnBasedParticipant *participant in match.participants) {
if ([participant.playerID isEqualToString:[GKLocalPlayer localPlayer].playerID]) {
[nextParticipants addObject:participant];
} else {
[nextParticipants insertObject:participant atIndex:0];
}
}
NSData *matchData = [@"some data" dataUsingEncoding:NSUTF8StringEncoding];
// Send new game state to Game Center & pass turn to next participant
[self.invitation.match endTurnWithNextParticipants: nextParticipants
turnTimeout: GKTurnTimeoutDefault
matchData: matchData
completionHandler: ^(NSError *error) {
// do something like refreshing UI
} ];
Yet, the second part of my question still stands. It's unclear to me how to make auto-matching work conditionally (like: I'm willing to auto-match with someone who wants to race with Formula 1 cars, but not with Rally cars).