2013-03-27 94 views
4

我一直在开发允许多人比赛的游戏。我之前测试过多人邀请,他们都已经工作。发送来自一个设备的请求在另一个设备上显示一条横幅,如果该邀请被接受,则游戏开始。不显示游戏中心邀请

就在提交应用程序之前,两个晚上,我再次测试了这个功能,发现它已经停止工作。

- (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的网站上下载并运行了用于创建多人游戏的教程并尝试过。这表现出相同的问题,除非它在两个设备上运行在前台。即使在前台运行,我的应用也不会显示邀请请求。

有没有其他人遇到过这个问题或者有什么想法是怎么回事? authenticateLocalUser从在applicationDidFinishLaunching

回答

1

唯一的办法我能邀请按姓名的工作称为是去Settings/Notifications/Game Center,使游戏中心显示警报,没有横幅。

如果您有GC显示警报,你会得到一个弹出框是这样的:

enter image description here

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

如果用户点击Decline,那么您的游戏永远不会知道他被邀请参加任何派对。用户击中Decline意味着父母撕开邀请,永远不会告诉他的孩子他被邀请参加比赛。

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