2013-08-07 21 views
5

Tôi đang cố gắng để có được mai mối địa phương làm việc trong GameKit sử dụng [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:]. Về cơ bản, tôi đang cố gắng triển khai các giao diện địa phương ít giao diện hơn: miễn là có một người chơi ở vùng lân cận địa phương của tôi, tôi muốn kết nối và bắt đầu một trận đấu. Quan trọng hơn, tôi chỉ muốn thực hiện việc này cho người chơi địa phương: Tôi không bao giờ muốn đối sánh tự động qua internet.Một số startBrowsingForNearbyPlayersWithReachableHandler questions

Tôi đã bật Trung tâm trò chơi cho ứng dụng của mình trong iTunes kết nối và đăng ký tài khoản sandbox khác trên mọi thiết bị tôi đang sử dụng để kiểm tra.

Tôi đã thử cả hai công cụ mai mối với GKMatchmakerViewController (sau khi xác thực trình phát nội bộ) và ghép nối có lập trình với startBrowsingForNearbyPlayersWithReachableHandler:, chạy cùng mã trên iPhone 4 và iPod Touch thế hệ thứ tư ngồi cạnh nhau trên bàn làm việc của tôi. Không bao giờ tìm thấy người khác; khi sử dụng GKMatchmakerViewController giao diện cho việc tìm kiếm người chơi gần đó vẫn còn ở

chơi tìm ...

spinner, và khi sử dụng startBrowsingForNearbyPlayersWithReachableHandler:, khối thông báo không bao giờ được gọi.

Dưới đây là khối hiện tại của tôi mã kiểm tra:

-(void)connectLocal 
{ 
    if(![GKLocalPlayer localPlayer].isAuthenticated) 
    { 
     // authenticateLocalPlayer calls connectLocal again after authentication is complete 
     [ self authenticateLocalPlayer ]; 
     return; 
    } 
    [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:^(NSString *playerID, BOOL reachable) { 
      NSLog(@"Reachability changed for player %@", playerID); 
     } ]; 
} 

Các tài liệu là một chút thưa thớt & gây nhầm lẫn về chủ đề này, đặc biệt là khi nói đến sự khác biệt giữa mulitplayer địa phương và phù hợp qua internet. Ví dụ: có vẻ như cần thiết để xác thực trình phát nội bộ và tạo trận đấu trước khi tìm người chơi tham gia trận đấu đó (Creating Any Kind of Match Starts with a Match Request). Tuy nhiên this little nugget dường như đề xuất cách khác:

Giao diện người dùng chuẩn cho phép người chơi hiện đang kết nối trực tiếp với Trung tâm trò chơi.

Thêm vào đó, trong dòng chảy được mô tả trong Searching For Nearby Players, một yêu cầu trận đấu không được tạo ra cho đến khi bước 3, sau người chơi tìm kiếm thông qua các khối thông báo truyền cho startBrowsingForNearbyPlayersWithReachableHandler:. Thật không may, tôi đã không bao giờ có được đến nay.

Vì vậy, các câu hỏi:

1) Tôi có ngay trong suy nghĩ tôi có thể gọi startBrowsingForNearbyPlayersWithReachableHandler: trước khi chứng thực các cầu thủ địa phương? GameKit không ném một lỗi, vì vậy tôi giả sử nó là OK. Đây có thể là một giả định phát ban. Cho dù tôi xác thực hay không dường như không tạo ra nhiều khác biệt.

2) Có ai đã triển khai thành công tính năng kết hợp tự động địa phương bằng cách sử dụng [GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler: không? Có mã ví dụ tốt ở bất kỳ nơi nào minh họa luồng hoàn chỉnh, từ trình duyệt cho người chơi để bắt đầu trận đấu, tất cả đều theo chương trình?

3) Dường như có các báo cáo xung đột trên web về việc liệu các ứng dụng hỗ trợ GameKit có thể được kiểm tra trong Trình mô phỏng iOS hay không. Sự đồng thuận chung dường như không, và tốt hơn nên kiểm tra trên phần cứng iOS. Tôi đã sử dụng iPhone 4 & iPod Touch thế hệ thứ tư. Đối với những người đã thử nghiệm thành công nhiều người chơi địa phương, bạn đã sử dụng phương pháp thiết lập thử nghiệm nào &?

+0

Hmm. Không có câu trả lời nào cả. Tôi có cùng một vấn đề. – bobmoff

+0

Tôi đã yêu cầu hỗ trợ kỹ thuật của Apple về điều này ngay bây giờ, .. hy vọng họ biết câu trả lời. – bobmoff

Trả lời

1

Bạn cần phải làm những việc này theo thứ tự này:

  1. Xác thực các cầu thủ địa phương
  2. Cài đặt lời mời handler
  3. duyệt Bắt đầu cho người chơi lân cận

xác thực là cần thiết - điều này đăng ký ứng dụng của bạn với Game Center và ghi lại trình phát. Trong hầu hết các trường hợp, bạn thậm chí sẽ không cần truy cập internet để thực hiện việc này.

Cài đặt trình xử lý lời mời cũng được yêu cầu và tôi nghĩ đây là bước bạn bị thiếu. Điều này cho phép ứng dụng của bạn biết phải làm gì khi nhận được thư mời đến. Nếu bạn không làm điều này, một thiết bị sẽ không đăng ký như đang ở gần.

Chỉ bắt đầu duyệt khi bạn đã thực hiện xong hai bước trên.

Dưới đây là một số mã mẫu để giúp bạn thực hiện. Gọi phương pháp này sau khi ứng dụng khởi chạy:

- (void) authenticateLocalPlayer 
{ 

    static BOOL gcAuthenticationCalled = NO; 
    if (!gcAuthenticationCalled) { 
     GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 

     void (^authenticationHandler)(UIViewController*, NSError*) = ^(UIViewController *viewController, NSError *error) { 
      NSLog(@"Authenticating with Game Center."); 
      GKLocalPlayer *myLocalPlayer = [GKLocalPlayer localPlayer]; 
      if (viewController != nil) 
      { 
       NSLog(@"Not authenticated - storing view controller."); 
       self.authenticationController = viewController; 
      } 
      else if ([myLocalPlayer isAuthenticated]) 
      { 
       NSLog(@"Player is authenticated!"); 

       //iOS8 - register as a listener 
       [localPlayer unregisterAllListeners]; 
       [localPlayer registerListener:self]; 

       [[GKLocalPlayer localPlayer] loadFriendPlayersWithCompletionHandler:^(NSArray *friendPlayers, NSError *error) { 

        //Do something with the friends 

       }]; 

       //iOS7 - install an invitation handler 
       [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) { 
        // Insert game-specific code here to clean up any game in progress. 
        if (acceptedInvite) 
        { 
         //This player accepted an invitation. 
         //If doing programmatic matchmaking, call GKMatchmaker's matchForInvite:completionHandler 
         //to get a match for the invite. Otherwise you need to allocate a GKMatchmakerViewController 
         //instance and present it with the invite. 

        } 
        else if (playersToInvite) 
        { 
         //Your game was launched from the GameCenter app to host a match. 
        } 
       }; 

       //Now you can browse. Note this is the iOS8 call. The iOS7 call is slightly different. 
       [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithHandler:^(GKPlayer *player, BOOL reachable) { 

        NSLog(@"Player Nearby: %@", player.playerID); 

       }]; 



      } 
      else 
      { 
       //Authentication failed. 
       self.authenticationController = nil; 
       if (error) { 
        NSLog([error description], nil); 
       } 
      } 


     }; 

     localPlayer.authenticateHandler = authenticationHandler; 
     gcAuthenticationCalled = YES; 
    } 
} 

* QUAN TRỌNG * Nếu bạn đang sử dụng iOS8, bạn không cài đặt bộ xử lý lời mời. Bạn thay vì đăng ký một đối tượng như nghe cho GKLocalPlayerListener giao thức, và thực hiện các phương pháp này:

-player:didAcceptInvite: 
-player:didRequestMatchWithRecipients: 

Nếu bạn không thực hiện các phương pháp trên iOS8, nó sẽ không hoạt động!

Bạn sau đó liên kết GKMatchmaker đến đối tượng đó bằng cách gọi này sau khi chứng thực các cầu thủ địa phương:

[localPlayer registerListener:self]; 

Hãy chắc chắn rằng đối tượng đó là việc thực hiện các giao thức được khai báo như vậy trong.h file:

@interface MyImplementingObject : NSObject <GKMatchDelegate, GKLocalPlayerListener> 

Nếu bạn làm tất cả điều này và nó vẫn không hoạt động, hãy chắc chắn rằng bạn có bó ID của bạn được đặt đúng trong ứng dụng của bạn (Nhấp vào ứng dụng, nhấp vào 'mục tiêu', hãy chắc chắn Bundle định danh và Phiên bản được điền vào), sau đó nhấp vào tab 'Khả năng' (XCode 6) và đảm bảo Trung tâm trò chơi đã bật.

Đi tới Trung tâm thành viên và đảm bảo rằng ứng dụng sử dụng ID gói đó cũng đã bật Trung tâm trò chơi cho Hồ sơ cấp phép của ứng dụng. Tải xuống và đăng ký lại Hồ sơ cấp phép của bạn nếu cần.

Đảm bảo nút chuyển đổi hộp cát BẬT trong Cài đặt của bạn trong GameCenter và cũng đảm bảo rằng các nút 'Cho phép lời mời' và 'Người chơi lân cận' được BẬT.

Cuối cùng, hãy đảm bảo bạn truy cập iTunes Connect và xác minh rằng Trung tâm trò chơi cũng được bật cho ứng dụng của bạn ở đó.

+0

Đối với những người mới chơi Game Center, bạn cũng có thể xem ứng dụng Game Center mẫu của tôi trên GitHub - đó là ứng dụng vani vừa xác thực Game Center, kết nối với người chơi lân cận và bắt đầu trò chuyện thoại. Có một số lỗi hiện tại với tính năng trò chuyện thoại trong iOS8 và ứng dụng này đã được tạo để chứng minh những vấn đề đó - https://www.github.com/sbudhram/GameCenterDemo –

2

1) Tôi có nghĩ rằng mình có thể gọi startBrowsingForNearbyPlayersWithReachableHandler: trước khi xác thực trình phát nội bộ?

số startBrowsingForNearbyPlayersWithReachableHandler tác phẩm của cả quảng cáo các cầu thủ hiện có và duyệt web cho người chơi khác, nhưng quan trọng nhất là thông tin mà nó sử dụng để xác định người chơi là playerID ... mà sẽ không có sẵn cho đến khi các cầu thủ xác nhận.

3) Dường như có các báo cáo xung đột trên web về việc liệu các ứng dụng hỗ trợ GameKit có thể được kiểm tra trong Trình mô phỏng iOS hay không. sự đồng thuận chung dường như không, và nó tốt hơn để thử nghiệm trên phần cứng iOS

xác thực GameCenter, thành tích, và bảng xếp hạng làm việc trong mô phỏng, mọi thứ khác nên được thử nghiệm trên phần cứng thực sự. Tôi thực sự khuyên bạn nên sử dụng trình mô phỏng để kiểm tra xác thực vì nó tránh được chuyển đổi hộp cát/sản xuất có thể thực hiện kiểm tra auth chi tiết trên các thiết bị hơi khó hiểu. Mọi thứ khác chỉ có thể được kiểm tra trên thiết bị. Trình mô phỏng không có hỗ trợ tuyệt vời để nhận thông báo đẩy làm hỏng thiết lập khớp và cấu hình phần cứng chung đủ khác nhau để phù hợp với giao tiếp không có khả năng hoạt động bình thường.

1

Vì vậy, hãy nhớ sự khác biệt giữa iOS7 và iOS8. Mã này sẽ hoạt động trên cả hai phiên bản và gọi 'updateNearbyPlayer' lần lượt.

if (IS_IOS8) 
{ 
    [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithHandler:^(GKPlayer *gkPlayer, BOOL reachable) 
    { 
     NSLog(@"PLAYER ID %@ is %@",gkPlayer.playerID,[email protected]"reachable" : @"not reachable"); 
     [self updateNearbyPlayer:gkPlayer reachable:reachable]; 
    }]; 

} else { 
    /* 
    * iOS 7... 
    */ 
    [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:^(NSString *playerID, BOOL reachable) 
    { 
     NSLog(@"PLAYER ID %@ is %@",playerID,[email protected]"reachable" : @"not reachable"); 

     [GKPlayer loadPlayersForIdentifiers:@[playerID] withCompletionHandler:^(NSArray *players, NSError *error) { 
      NSLog(@"Loaded: %@, error= %@",players,error); 
      GKPlayer *gkPlayer = [players objectAtIndex:0]; 
      [self updateNearbyPlayer:gkPlayer reachable:reachable]; 
     }]; 
    }]; 
} 

Với một số chậm trễ do dịch vụ Bonjour cơ bản, cơ chế này hoạt động rất tốt. Tuy nhiên, nó cần phải được cân bằng với một cuộc gọi thích hợp để:

[[GKMatchmaker sharedMatchmaker] stopBrowsingForNearbyPlayers]; 

Bất cứ khi nào bạn sử dụng một trong những GKPlayers/PlayerIDs báo cáo để thành lập một trận đấu hoặc để thêm nó vào một trận đấu hiện tại, bạn nên dừng lại trình duyệt. Sau khi kết thúc trận đấu, đóng hoặc hủy, hãy bắt đầu duyệt lại. Nếu không, vào lần thử thứ hai để kết nối với một thiết bị lân cận, bạn sẽ thất bại.

Các vấn đề liên quan