未显示游戏中心邀请

时间:2013-03-27 18:20:43

标签: iphone ios game-center multiplayer

我一直在开发一款允许多人比赛的游戏。我之前测试过多人游戏邀请函,但他们一切都有效。从一个设备发送请求在另一个设备上显示横幅,如果邀请被接受则游戏开始。

两天前,在提交应用程序之前,我再次测试了此功能,却发现它已停止工作。

- (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];
        }
    };
}

xcode中的调试窗口显示以下内容:

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;
    }]

“我是[] ......”在上面的行中是否显着?

我甚至从Ray Wenderlich的网站下载并运行教程来创建一个多人游戏并尝试了。除非它在两个设备上都在前台运行,否则它会出现同样的问题。即使在前台运行,我的应用也不会显示邀请请求。

是否有其他人遇到此问题或有任何想法发生了什么?从applicationDidFinishLaunching

调用authenticateLocalUser

1 个答案:

答案 0 :(得分:1)

我可以按名称工作的唯一方法是前往Settings/Notifications/Game Center并让游戏中心显示 提醒 ,而不是横幅。

如果您有GC显示警报,则会出现如下弹出框:

enter image description here

此对话框就像一个大父母。如果用户点击Accept,则会调用[GKMatchmaker sharedMatchmaker].inviteHandler

如果用户点击Decline,那么您的游戏永远不会知道他被邀请参加任何一方。用户点击Decline表示父母撕毁了邀请,并且从未告诉他的孩子他被邀请参加游戏。

这是我可以按名称邀请工作的唯一方法。