2016-12-09 23 views
1

在iOS 10上,我嘗試使用GKTurnBasedMatchmakerViewController創建匹配項。我可以調出視圖,以便用戶可以選擇配對或邀請。我無法弄清楚如何可靠地確定哪些匹配是爲了響應而創建的。問題在於,在iOS 10中,GKTurnBasedMatchmakerViewControllerDelegate的didFindMatch方法已被棄用。該方法曾用於匹配調用。過去的日子很簡單!如何可靠地確定創建響應GKTurnBasedMatchmakerViewController成功創建的匹配

棄用消息顯示「使用GKTurnBasedEventListener播放器:receivedTurnEventForMatch:didBecomeActive」。文檔和堆棧溢出線程充滿了調用該方法的原因。看到這個線程有一個很好的列表:Gamecenter ios 9 GameCenter GKLocalPlayerListener methods not called。如果你想象一個已經有好幾款遊戲的用戶,你就會發現這個方法會有很多不同的原因,並且據我所知可能會在任何時候發生。我的問題是:如何確定這些電話中的哪一個是「我爲你創建了一個匹配項,在這裏!」呼叫。

一些例子,我認爲行不通:

  • 簡單的假設,以receivedTurnEventForMatch出現這種情況,你以後帶來了GKTurnBasedMatchmakerViewController似乎是錯誤的,因爲receivedTurnEventForMatch可以通知輪到他們在另一個用戶第一個電話遊戲。除非系統保證在視圖啓動的同時,他們只會使用與視圖相對應的匹配來調用此方法。這似乎是一個很大的破解,所以我假設他們不這樣做。
  • 與其他玩家處於「匹配」狀態並且didBecomeActive = true的情況下調用receivedTurnEventForMatch似乎是匹配中第一個玩家的解決方案,但不是第二個玩家(因爲兩個玩家都匹配)。
  • 看着MatchID,看看我們是否「看過它」,如果不是,假設它是剛剛創建的匹配似乎不可靠,因爲用戶可能卸載了應用程序,然後重新安裝,我們已經忘記了所有關於我們已經「見過」的匹配。

我卡住了,任何幫助表示讚賞。

回答

0

當事件處理程序觸發時請仔細檢查您的狀態。我相信你應該仍然處於invited狀態,直到你接受比賽。

編輯:其實,我相信會有兩種情況,指示新的比賽的時候,事件處理程序便會啓動:

  1. 你是在邀請狀態(你加入)

  2. 所有人都在邀請或自動配對狀態(你開始比賽)

編輯2: 檢查我的舊代碼,事實證明我看着matchData對象。因爲我知道玩家2沒有收到邀請,直到玩家1結束了回合(等等),並且由於我知道玩家1必須保存匹配數據才能結束回合,如果matchData.length大於零,我假定我正在參加正在進行的遊戲。我沒有依賴參與者的地位。但是這並不能解決你的問題。

我做的另一件事是創建我自己的頭結構,我插入在NSData的開始。在該頭文件中,player1會爲每個其他玩家設置狀態標誌,這些玩家加入後會很明顯。我完全忽略了匹配對象中的參與者狀態。

關於您的第三個項目符號,您可以使用cloudKit遠程保存,而不是在本地保存列表。除非您專門刪除它,否則cloudkit數據將在安裝/卸載之間持續存在。

要點與cloudkit是:

  • 當你在你的應用程序啓用它,您的應用程序得到一個「容器」與公共的數據庫,所有用戶都可以共享加上唯一的每個應用程序用戶專用數據庫。
  • 您可以創建在私有數據庫中的記錄與「字節」字段
  • 可以保存NSMutableArray直接進入上述字節字段
  • 您可以從字節字段直接回讀NSMutableArray
+0

從我的測試中它不工作的方式:如果我開始自動 或邀請遊戲: 如果我 –

+0

從我的測試中這是行不通的,這樣我能在GKTurnBasedParticipantStatusActive狀態,並匹配玩家在GKTurnBasedPartic中ipantStatusMatching狀態。 正如我在上面提到的那樣:檢測receivedTurnEventForMatch是否讓您爲比賽中的第一位玩家開發新遊戲似乎很簡單:查找「匹配」狀態。這是挑戰的第二個球員,因爲他們都擁有「積極」的狀態(這也是很多其他時候這個事件被稱爲的情況)。 –

+0

@Eric,我用'GK *'達到了我的沮喪極限,並在幾個月前撕掉了所有的代碼。所以,我不得不去看看一些舊的分支,看看我以前做過什麼。我相應地更新了答案。 – Thunk