2013-03-27 93 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意味着父母撕開邀請,永遠不會告訴他的孩子他被邀請參加比賽。

這是我可以讓邀請名稱工作的唯一方法。