GKMatchmaker - match mit Einladung programmatisch erstellen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • GKMatchmaker - match mit Einladung programmatisch erstellen

    Hallo Zusammen,

    ich arbeite gerade einem Live Match Spiel für zwei Spieler über Game Center - wir sind also in der GKMatchmaker Welt.
    Ich möchte auch nicht den MatchMakerViewController von Apple nutzen, sondern mein eigenes User Interface. Das funktioniert für Matches gegen einen zufälligen Gegner super.

    Der Xcode Simulator ist ein Spieler. Mein iPhone mit Game Center Sandbox aktiviert ist der zweite Spieler. Natürlich sind beide mit unterschiedlichen AppleIDs im GameCenter angemeldet. Wie gesagt, das funktioniert :thumbsup:

    Ich möchte jedoch auch Einladungen abbilden und bekomme es einfach nicht hin. Ich habe jetzt auch echt schon viel am Code rumgebastelt und hoffe auf eure Hilfe.
    Natürlich sind beide AppleIDs miteinander befreundet.

    Quellcode

    1. - (void)challengeFriend:(GKPlayer*)friend withDelegate:(id<GCHelperDelegate>)theDelegate {
    2. NSLog(@"try to challenge friend: %@ %@", friend.playerID, friend.displayName);
    3. matchStarted = NO;
    4. self.match = nil;
    5. self.delegate = theDelegate;
    6. GKMatchRequest *request = [[GKMatchRequest alloc] init];
    7. request.minPlayers = 2;
    8. request.maxPlayers = 2;
    9. request.defaultNumberOfPlayers = 2;
    10. request.recipients = [[NSArray alloc] initWithObjects:friend, nil];
    11. request.inviteMessage = @"I invite you to play";
    12. [[GKMatchmaker sharedMatchmaker] findMatchForRequest:request withCompletionHandler:^(GKMatch* match, NSError *error) {
    13. // do the match making
    14. if (error) {
    15. NSLog(@"ERROR: Error makeMatch: %@", [error description] );
    16. } else if (match != nil) {
    17. NSLog(@"found match for Invitation");
    18. // Record the new match and set gchelper up as the delegate...
    19. self.match = match;
    20. self.match.delegate = self;
    21. }
    22. }];
    23. request.recipientResponseHandler = ^(GKPlayer *player, GKInviteRecipientResponse response){
    24. NSLog(@"GKInviteeResponse received");
    25. if (response == GKInviteeResponseAccepted) {
    26. NSLog(@"GKInviteRecipientResponse accepted");
    27. if ([(NSObject*)self.delegate respondsToSelector:@selector(foundMatch:)] ) {
    28. [self.delegate foundMatch:self.match];
    29. }else {
    30. NSLog(@"No delegate for foundMatch:");
    31. }
    32. } else {
    33. NSLog(@"GKInviteRecipientResponse: %ld", (long)response);
    34. if ([(NSObject*)self.delegate respondsToSelector:@selector(updateUIForPlayer:accepted:)]) {
    35. [self.delegate updateUIForPlayer:player.playerID accepted:(response == GKInviteeResponseAccepted)];
    36. }
    37. }
    38. };
    39. }
    Alles anzeigen
    Hier passiert eigentlich nichts schrecklich spannendes. Ich erstelle den GKMatchRequest und füge den Spieler den ich einladen möchte hinzu. Dann wird der GKMatchmaker angeschmissen. Außerdem installiere ich noch den seit iOS 8 neuen recipientResponseHandler.

    Mein Problem ist - es wird keine Einladung versandt.
    Nie!
    Ich komme bis NSLog(@"found match for Invitation");
    Aber wenn keine Einladung beim Freund ankommt, kann der die auch nicht annehmen und folglich wird der recipientResponseHandler nie ausgelöst.
    Irgendwas mache ich falsch - nur was ?(
    Oder funktionieren Einladungen nicht mit dem Simulator zusammen, das random Matchmaking jedoch schon?

    Vielen Dank im Voraus.
  • Eben. Du feuerst den Request und konfigurierst erst dann, was bei Annahme passieren soll.
    Das läuft ja asynchron und in Deiner Testumgebung vermutlich sehr zügig.

    Die Vermutung ist, dass der Request ohne recipientResponseHandler los rennt, weshalb der Empfänger keinen Dialog gezeigt bekommt.
    Wäre sinnvoll, da das Resultat des Dialogs ja nicht bearbeitet werden kann.

    Anschließend hängst Du den recipientResponseHandler rein, was Dir aber nix bringt, da der Request schon lange abgeschickt wurde.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Okay, es ist mir jetzt einigermaßen peinlich, dass ich so etwas Offensichtliches nicht gesehen habe.
    Es funktioniert jetzt besser, bleibt aber skurril.

    1. Zunächst habe ich rausgefunden / vermute ich, dass Invitations nur zwischen echten Geräten funktionieren und nicht mit dem Simulator. Kann das jemand bestätigen?

    2. Ich teste mit zwei iPhones, beide im GameCenter Sandbox Modus. Auf beiden der absolut gleiche Entwicklungsstand. Verschicke ich eine Einladung vom iPhone 6 and das iPhone 5 passiert gar nichts. Andersherum klappt alles wie es sein müsste. Woran könnte so etwas liegen?

    Hat hier schonmal jemand Invitations programmatisch behandelt? Ich freue mich wirklich über jeden Input.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ioscampus ()