Game Center Invitations Not Displayed
Asked Answered
S

1

4

I have been developing a game which allows for multiplayer matches. I had previous tested the multiplayer invitations and they had all worked. Sending a request from one device displayed a banner on the other and if the invite was accepted the game started.

Just before submitting the app, two nights ago, I tested this functionality again only to find that it has stopped working.

- (void)authenticateLocalUser:(UIViewController *)viewController :(id<GCHelperDelegate>)theDelegate
{ 
    delegate = theDelegate;
    self.presentingViewController = viewController;

    if (!gameCenterAvailable) {
        // Game Center is not available. 
        userAuthenticated = FALSE;
    } 
    else{
        GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];

        /*
         The authenticateWithCompletionHandler method is like all completion handler methods and runs a block
         of code after completing its task. The difference with this method is that it does not release the 
         completion handler after calling it. Whenever your application returns to the foreground after 
         running in the background, Game Kit re-authenticates the user and calls the retained completion 
         handler. This means the authenticateWithCompletionHandler: method only needs to be called once each 
         time your application is launched. This is the reason the sample authenticates in the application 
         delegate's application:didFinishLaunchingWithOptions: method instead of in the view controller's 
         viewDidLoad method.

         Remember this call returns immediately, before the user is authenticated. This is because it uses 
         Grand Central Dispatch to call the block asynchronously once authentication completes.
         */

        //ios 6
        [localPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) {
            if (viewcontroller != nil){
                userAuthenticated = FALSE;
                [self.presentingViewController presentViewController: viewcontroller animated: YES completion:nil];
            }
            else if (localPlayer.isAuthenticated){
                // Enable Game Center Functionality
                userAuthenticated = TRUE;


                [self checkForInvite:self.presentingViewController :delegate];

                if (! self.currentPlayerID || ! [self.currentPlayerID isEqualToString:localPlayer.playerID]) {

                    // Current playerID has changed. Create/Load a game state around the new user.
                    self.currentPlayerID = localPlayer.playerID;

                    // get friends of local player
                    [localPlayer loadFriendsWithCompletionHandler:^(NSArray *friends, NSError *error) {
                        if (friends != nil)
                        {
                            [self loadPlayerData: friends];
                        }
                    }];
                }
            }
            else{
                userAuthenticated = FALSE;
            }
            [scoreHandler setGameCentreAvailable:userAuthenticated];
        })];
    }
}


- (void)checkForInvite :(UIViewController *)viewController :(id<GCHelperDelegate>)theDelegate
{
    delegate = theDelegate;
    self.presentingViewController = viewController;
    NSLog(@"Invite handler installed");

    [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) {

        // Insert application-specific code here to clean up any games in progress. 
        if (acceptedInvite){
            NSLog(@"Accepted");
            GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite] autorelease];
            mmvc.matchmakerDelegate = self;
            [viewController presentViewController: mmvc animated: YES completion:nil];

        } else if (playersToInvite) {
            NSLog(@"Match Request");
            GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
            request.minPlayers = 2; 
            request.maxPlayers = 2; 
            request.playersToInvite = playersToInvite;
            GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
            mmvc.matchmakerDelegate = self;
            [viewController presentViewController: mmvc animated: YES completion:nil];
        }
    };
}

The debug window in xcode shows the following:

2013-03-27 18:06:20.112 MyApp[791:907] Authentication changed: player authenticated.
2013-03-27 18:06:21.219 MyApp[791:907] Invite handler installed
Mar 27 18:06:21 Neils-iPhone MyApp[791] <Notice>: 18:06:21.356712 com.apple.GameKitServices: -[GKDiscoveryManager startAdvertisingLocalPlayer:discoveryInfo:]: I am [<nil>] [7989F444CF2BDA83] discoveryInfo [{
        e = 2;
        h = A42FD7FD;
    }]

Is the "I am []..." significant in the lines above?

I have even downloaded and run the tutorial from Ray Wenderlich's site for creating a multiplayer game and tried that. That exhibits the same issues, unless it is running in the foreground on both devices. My app does not display invitation requests even if running in the foreground.

Has anyone else experienced this problem or have any ideas what is going on? authenticateLocalUser is called from applicationDidFinishLaunching

Spermophile answered 27/3, 2013 at 18:20 Comment(0)
G
1

The only way I could make invites-by-name work is by going to Settings/Notifications/Game Center and making Game Center display Alerts, not Banners.

If you have GC display alerts, you get a popup box like this:

enter image description here

This dialog acts like a big parent. If the user hits Accept, then your [GKMatchmaker sharedMatchmaker].inviteHandler gets invoked.

If the user hits Decline, then your game never knows that he was invited to any party ever. User hitting Decline means the parent rips up the invitation and never tells his child he got invited to a game at all.

This is the only way I could get invite-by-name to work.

Glindaglinka answered 12/5, 2013 at 18:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.