2012-04-27 15 views
2

我在兩臺iOS設備之間建立了連接,使用GameKit和GKMatch進行同步遊戲。當一個玩家進入後臺時,連接將斷開。我怎樣才能避免這種行爲?是否有可能通過GKMatch保持連接處於活動狀態,而有一位用戶將應用程序暫停後臺?Gamekit在進入後臺時繼續會話

回答

2

根據蘋果的文檔:

只要你的遊戲移動到背景下,本土選手對象的認證屬性的值變,直到你的遊戲移回前景仍然無效。您無法讀取該值以確定播放器是否仍然通過驗證,直到Game Kit重新驗證播放器並調用您的驗證處理程序。除非您的完成處理程序被調用,否則您的遊戲必須表現得好像沒有經過身份驗證的玩家。一旦你的處理程序被調用,存儲在認證屬性中的值再次有效。

來源:Game Center Programming Guide, pg. 39

除非您的應用程序採用VOIP或特殊情況適用,否則您不應該在後臺打開網絡連接。 (如果你有興趣,請查看this SO question以瞭解黑客的方式)。 由於您的播放器身份驗證在進入後臺時失效,因此其他設備(如果確實能夠從後臺應用程序接收網絡數據)不會(可靠地)知道哪個GKPlayer發送了該信息。

所以,儘管Apple沒有明確說出,但在應用程序進入後臺時通常應取消所有Game Center功能,並在重新啓動後重新進行身份驗證後恢復。

作爲一個側面說明,當應用程序退出到背景時,它是(通常取決於後臺任務)被視爲「有資格暫停」。這就是多任務執行存在這種限制的原因之一 - 您的應用程序可能會在任何時候被殺死以釋放內存,並且當這種情況發生時您並不真的想要進行繁重的數據傳輸! 如果您想了解有關網絡和多任務處理的更多信息,請參見TN227

編輯:另一種方法:

雖然不可能保持一個GKMatch活着而一個應用程序在後臺運行,來模擬這種行爲的另一種方式將遊戲狀態保存到您的擁有服務器。要求用戶在他/他離開遊戲之前與某個用戶界面(可能按下一個按鈕)進行交互,這會將當前遊戲狀態保存到自己的服務器,並通知其他玩家您即將離開遊戲。重新啓動後,查詢您的服務器以查看是否有任何已保存的遊戲,如果有,請加載遊戲狀態並向其他玩家發送通知。這並不是嚴格保持同一個遊戲,而是一種近似你以後的行爲的方法。

1

這是不可能的

,你可以不喜歡當一個球員在後臺

在這種情況下 輸入 - (空)applicationDidEnterBackground:(UIApplication的*)應用程序{} 消息發送到第二播放器中的分組數據第一玩家進入在背景

然後在 - (無效)receiveData的:(NSData的*)數據fromPeer:(的NSString *)對等inSession:(GKSession *)會話上下文:(無效*)上下文; { } 當perticuler數據停止您的應用程序並彈出到以前的視圖