2013-08-23 36 views
5

在我們的iOS遊戲中,我們使用Game Center來識別玩家並使用我們自己的服務器跨設備同步他們的數據。由於Game Center識別玩家,我們需要知道他們是否已通過身份驗證,或者他們是否更改了身份驗證等。我們有一個標題屏幕,顯示「Initializing Game Center ...」,直到身份驗證呼叫返回,並且只有一次我們知道他們被認證爲誰(如果有的話)我們是否進入遊戲。有時候,Game Center身份驗證處理程序永遠不會被調用

然而,時間極少量的(其實,我無法重現它自己),認證處理程序不會被調用,直到永遠。甚至沒有等待幾分鐘。遊戲中心歡迎橫幅從不顯示任何一個,所以不是我們的處理程序從來沒有被調用過,但它確實沒有身份驗證狀態。

到目前爲止,我們已經實現,其中,如果我們不聽到遊戲中心什麼,我們假設認證狀態並沒有改變30秒超時,我們使用您保存的數據。 30秒的超時時間並不理想,所以我想知道當GC沒有響應時是否有任何押韻或原因。

這是從我們的應用程序委託的application: didFinishLaunchingWithOptions:方法調用的代碼:我對我們的沙盒服務器上的遊戲之一測試期間有過這種經歷

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

你確定localPlayer不是零嗎? 你有沒有猜測與iOS版本的處理程序不被調用?它是最終版本還是測試版本? 如果iOS 7測試版,填寫錯誤報告給Apple。 你確定沒有設置完成處理程序爲零嗎? – Gougou

+0

會發生什麼?它記錄錯誤,還是什麼都不記錄?當遊戲中心不工作時,知道輸出是什麼會很好。 – Binarian

+0

@Gougou這已經發生在iOS 6上,據我所知,不是測試版本。 –

回答

3

,沒有真正的通知或認證處理程序調用有時候,那麼半小時後就會工作。

我們summised,這是由於蘋果的服務器端,因爲我們從來沒有遇到過遊戲中心沙箱之外的這個問題。

對不起,解釋有點模糊,沒有什麼具體的,你可以做。但這不是你的代碼。最後你無法控制。

+0

這可能是最好的答案。我不會接受它,希望在那裏有另一個答案(無論如何,賞金已經過期)。不管怎麼說,還是要謝謝你。 –

+0

不用擔心,有時候蘋果的服務會讓人覺得自己處於不斷變化的狀態,沒有令人滿意的方式來解決所有問題。 –

+0

@RuddZwolinski你在主遊戲中心服務器上是否有這個問題(例如不是沙箱)?因爲我有同樣的問題,除了在我的情況下,這不是一個隨機事件。它發生在我取消登錄表單時,然後從這個視圖控制器彈出到上一個。然後再次調用身份驗證。第二次我沒有收到任何迴應。我不知道該怎麼做= /我在沙盒遊戲中心。 –

0

嘗試收聽GKPlayerAuthenticationDidChangeNotificationName,應在認證後通知。這至少可以推斷缺少的消息。

問題可能出在Apple的服務器上。您可以通過從iPhone使用的網絡代理運行wireshark跟蹤來消除這種情況。如果它只能從其他人的手機上看到,那麼可能會記錄他們所經歷的網絡連接性和可達性,以便在他們的最終特定網絡事件被責備時進行關聯。

也是其值得記錄的NSErrors在情況下,你的代碼的一部分,它想告訴你的東西被忽略了。

0

我們在這裏遇到了同樣的問題,我們只是發現了一些人在無線上發生的問題。事實證明,GameCenter需要一些荒謬的防火牆配額才能正常工作:https://support.apple.com/en-us/HT202944 我們認爲問題在於某些網絡阻塞了這些端口,從而導致該呼叫從不響應。

相關問題