2013-08-23 43 views
5

Trong trò chơi iOS, chúng tôi đang sử dụng Trung tâm trò chơi để xác định người chơi và đồng bộ hóa dữ liệu của họ trên các thiết bị sử dụng máy chủ của chúng tôi. Bởi vì Trung tâm trò chơi xác định người chơi, chúng tôi cần biết liệu họ có được xác thực hay không hoặc họ đã thay đổi xác thực hay không… Chúng tôi có màn hình tiêu đề hiển thị "Khởi tạo Trung tâm trò chơi ..." cho đến khi cuộc gọi xác thực trở lại và chỉ một lần chúng tôi biết họ được xác thực là ai (nếu có) để chúng tôi tham gia trò chơi.Đôi khi trình xử lý xác thực của Trung tâm trò chơi không bao giờ được gọi là

Tuy nhiên, một lượng rất nhỏ thời gian (trên thực tế, tôi không thể tự tái tạo), trình xử lý xác thực không bao giờ được gọi, bao giờ hết. Thậm chí sau vài phút chờ đợi. Biểu ngữ chào mừng của Trung tâm trò chơi không bao giờ hiển thị, vì vậy nó không chỉ là trình xử lý của chúng tôi không bao giờ được gọi, nhưng thực sự không có trạng thái xác thực nào.

Cho đến nay chúng tôi đã triển khai thời gian chờ 30 giây, nếu chúng tôi không nghe thấy gì từ Game Center, chúng tôi cho rằng trạng thái xác thực không thay đổi và chúng tôi sử dụng dữ liệu đã lưu của bạn. Thời gian chờ 30 giây đó không phải là lý tưởng, vì vậy tôi tự hỏi liệu có bất kỳ vần điệu hay lý do nào không khi GC không phản hồi.

Đây là đoạn mã đó được gọi là từ phương pháp application: didFinishLaunchingWithOptions: App Đại biểu của chúng tôi:

PlayerModel *playerModel = [PlayerModel sharedPlayerModel]; 
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
if ([localPlayer respondsToSelector:@selector(setAuthenticateHandler:)]) 
{ 
    localPlayer.authenticateHandler = ^(UIViewController *gkViewController, NSError *error) 
    { 
     if (localPlayer.authenticated) 
     { 
      [playerModel loadFromGameCenter]; 
      playerModel.hasGCStatus = TRUE; 
      [playerModel sync]; 
     } 
     else if (gkViewController) 
     { 
      [viewController presentViewController:gkViewController animated:TRUE completion:nil]; 
     } 
     else 
     { 
      NSLog(@"Could not authenticate with Game Center"); 
      [playerModel unloadFromGameCenter]; 
      playerModel.hasGCStatus = TRUE; 
      [playerModel sync]; 
     } 
    }; 
} 
else 
{ 
    [localPlayer authenticateWithCompletionHandler:^(NSError *error) { 
     if (localPlayer.authenticated) 
     { 
      [playerModel loadFromGameCenter]; 
      playerModel.hasGCStatus = TRUE; 
      [playerModel sync]; 
     } 
     else 
     { 
      NSLog(@"Could not authenticate with Game Center"); 
      [playerModel unloadFromGameCenter]; 
      playerModel.hasGCStatus = TRUE; 
      [playerModel sync]; 
     } 
    }]; 
} 
+0

Bạn có chắc chắn localPlayer không phải là không? Bạn có bất kỳ dự đoán nào về phiên bản iOS mà trình xử lý không được gọi không? Đây là phiên bản cuối cùng hay phiên bản beta? Nếu iOS 7 beta, hãy điền vào một báo cáo lỗi cho Apple. Bạn có chắc chắn không thiết lập trình xử lý hoàn thành ở những nơi khác không? – Gougou

+0

Điều gì xảy ra? Nó có ghi lại lỗi hay không gì cả? Nó sẽ là tốt để biết đầu ra là gì, khi trung tâm trò chơi không hoạt động. – Binarian

+0

@Gougou điều này đã xảy ra trên iOS 6 theo hiểu biết tốt nhất của tôi, không phải phiên bản beta. –

Trả lời

3

Tôi đã có kinh nghiệm này trong thời gian thử nghiệm trên một trong những trò chơi của chúng tôi trên máy chủ sandbox, có thực sự là không có thông báo hoặc xác nhận cuộc gọi handler đôi khi, sau đó nó chỉ hoạt động sau nửa giờ.

Chúng tôi đã kết luận rằng đó là do kết thúc máy chủ của Apple vì chúng tôi chưa bao giờ gặp sự cố này bên ngoài hộp cát của Trung tâm trò chơi.

Rất tiếc, giải thích hơi mơ hồ và không có gì cụ thể mà bạn có thể làm. Nhưng đó không phải là mã của bạn. Đó là vào cuối mà bạn không thể kiểm soát.

+0

Đây có lẽ là câu trả lời hay nhất hiện có.Tôi sẽ không chấp nhận nó, với hy vọng rằng có một câu trả lời khác ngoài kia (tiền thưởng đã hết hạn). Dù sao cũng cảm ơn bạn. –

+0

Không phải lo lắng, đôi khi các dịch vụ của Apple cảm thấy như họ đang ở trong thông lượng và không có cách thỏa đáng để đạt được cách thỏa đáng để nắm bắt tất cả các vấn đề mà nó gây ra. –

+0

@RuddZwolinski bạn có gặp sự cố này trên máy chủ trung tâm trò chơi chính (ví dụ: không phải hộp cát) không? Bởi vì tôi có cùng một vấn đề, ngoại trừ trong trường hợp của tôi đây không phải là một sự kiện ngẫu nhiên. Điều này xảy ra khi tôi hủy biểu mẫu đăng nhập, sau đó bật từ trình điều khiển chế độ xem này sang trình điều khiển trước đó. Và sau đó gọi xác thực một lần nữa. Vào lần thứ hai, tôi không nhận được bất kỳ phản hồi nào. Tôi không biết phải làm gì =/Tôi đang ở trên một trung tâm trò chơi sandbox. –

0

Hãy thử nghe GKPlayerAuthenticationDidChangeNotificationName sẽ thông báo sau khi xác thực. Điều này ít nhất có thể suy ra một thông báo còn thiếu.

Có thể sự cố xảy ra ở máy chủ của Apple. Bạn có thể loại bỏ điều đó bằng cách chạy một dấu vết wireshark từ một proxy mạng mà iPhone của bạn sử dụng. Nếu nó chỉ được nhìn thấy từ điện thoại của người khác, thì có thể đăng nhập kết nối mạng và khả năng truy cập mà họ gặp phải để tương quan nếu các sự kiện mạng cụ thể ở cuối của họ là để đổ lỗi.

Cũng đáng để ghi lại mã số NSErrors như một phần trong mã của bạn trong trường hợp cố gắng cho bạn biết điều gì đó đang bị bỏ qua.

0

Chúng tôi gặp vấn đề tương tự ở đây mà chúng tôi nhận ra chỉ xảy ra đối với một số người trên wifi. Hóa ra GameCenter đòi hỏi một số lượng vô hạn các phụ cấp tường lửa để làm việc: https://support.apple.com/en-us/HT202944 Chúng tôi tin rằng vấn đề là một số mạng chặn các cổng này sau đó khiến cuộc gọi không bao giờ phản hồi.