[英]Gamecenter ios 9 GameCenter GKLocalPlayerListener methods not called
這是關於GameCenter
的。
由於“ GKLocalPlayerListener
協議繼承了GKChallengeListener
、 GKInviteEventListener
和GKTurnBasedEventListener
的方法。
為了處理多個事件”和“不要直接實現GKChallengeListener
、 GKInviteEventListener
和GKTurnBasedEventListener
; 改為實施GKLocalPlayerListener
。
您可以使用GKLocalPlayerListener
監聽和處理多個事件”(這些來自蘋果文檔)。
人們會期望在GKLocalPlayer.localPlayer()
已通過身份驗證后注冊GKLocalPlayerListener
之后,當適當的事件發生時,將調用GKLocalPlayerListener
中的所有方法。
然而,除了調用“player(player: GKPlayer
, receivedTurnEventForMatch match: GKTurnBasedMatch
, didBecomeActive: Bool)”之外,所有其他方法,包括“player(player: GKPlayer
, matchEnded match: GKTurnBasedMatch
)”在這樣的情況下永遠不會被調用一個事件發生。
我們需要注冊其他聽眾還是我缺少什么?
關於檢測到您已被邀請參加回合制比賽:沒有發送任何事件,但是當您從服務器查詢您的比賽列表時,您只會突然出現一個新比賽(並且您的狀態將被邀請)。 (不過,收件人確實會收到 UIAlert 提示,表明他們已收到邀請)
關於各種 API 函數是否/何時觸發,我花了很多很多時間試圖破譯這些不同的函數何時觸發。 我已經針對功能或文檔打開了多個錯誤。 這是我目前的筆記; 這就是我在我的助手類中組織所有委托函數的方式,指示它們適用於哪個偵聽器以及關於導致它們觸發的原因的注釋。
你可以看到有幾個我從未破譯過。 對此列表的任何其他輸入/說明將不勝感激。
#pragma mark - specific to real-time matches
//this is for real-time matches only (but the docs don't say that)
-(void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite
#pragma mark - saved game listener (GKSavedGameListener)
//never fires. Theory: only fires if the SAME player tries to save the game from a different device while being the active player
-(void)player:(GKPlayer *)player didModifySavedGame:(GKSavedGame *)savedGame
//never fires. Theory: only fires if the SAME player tries to save the game from a different device while being the active player
-(void)player:(GKPlayer *)player hasConflictingSavedGames:(NSArray *)savedGames
#pragma mark - game launched via game center (GKLocalPlayerListener)
//DEPRECATED: This is fired when the user asks to play with a friend from the game center.app
-(void)player:(GKPlayer *)player didRequestMatchWithPlayers:(NSArray *)playerIDsToInvite
//This is fired when the user launches the game from Game Center and requests to play with a friend
-(void)player:(GKPlayer *)player didRequestMatchWithRecipients:(NSArray *)recipientPlayers
//Never seen this fire. Possibly fired when the user launches the game from Game Center. Unclear how this varies from didRequestMatchWithRecipients
-(void)player:(GKPlayer *)player didRequestMatchWithOtherPlayers:(NSArray *)playersToInvite
#pragma mark - Ending turn based matches (GKLocalPlayerListener)
//I've never seen this fire
-(void)player:(GKPlayer *)player matchEnded:(GKTurnBasedMatch *)match
//I've never seen this fire
-(void)player:(GKPlayer *)player wantsToQuitMatch:(nonnull GKTurnBasedMatch *)match
#pragma mark - challenges (GKLocalPlayerListener)
//untested, I don't use challenges
-(void)player:(GKPlayer *)player issuedChallengeWasCompleted:(GKChallenge *)challenge byFriend:(GKPlayer *)friendPlayer
//untested, I don't use challenges
-(void)player:(GKPlayer *)player didCompleteChallenge:(GKChallenge *)challenge issuedByFriend:(GKPlayer *)friendPlayer
//untested, I don't use challenges
-(void)player:(GKPlayer *)player didReceiveChallenge:(GKChallenge *)challenge
//untested, I don't use challenges
-(void)player:(GKPlayer *)player wantsToPlayChallenge:(GKChallenge *)challenge
#pragma mark - exchanges (GKLocalPlayerListener)
//seems to work as expected
-(void)player:(GKPlayer *)player receivedExchangeCancellation:(GKTurnBasedExchange *)exchange forMatch:(GKTurnBasedMatch *)match
//this fires for the Current Player AND the Exchange Initiator AFTER all replies/timeouts are complete.
-(void)player:(GKPlayer *)player receivedExchangeReplies:(NSArray *)replies forCompletedExchange:(GKTurnBasedExchange *)exchange forMatch:(GKTurnBasedMatch *)match
//seems to work as expected
-(void)player:(GKPlayer *)player receivedExchangeRequest:(GKTurnBasedExchange *)exchange forMatch:(GKTurnBasedMatch *)match
#pragma mark - event handler (GKLocalPlayerListener)
-(void)player:(GKPlayer *)player receivedTurnEventForMatch:(GKTurnBasedMatch *)match didBecomeActive:(BOOL)didBecomeActive
/*
Apple says this fires when:
1. When it becomes the active player's turn, including the inviting player creating a new match (CHECK)
2. When the time out is about to fire (FAIL. It fires AFTER the timeout expires, which may just be item #4 happening)
3. Player accepts an invite from another player (FAIL. Never happens. Instead it fires when an INVITED player starts playing a session FROM this player.)
4. Turn was passed to another player. (CHECK)
5. player receives a reminder (CHECK, confirmed by μ4ρκ05)
It Also fires when:
6. A remote user quits (CHECK)
7. A remote user declines (unconfirmed)
8. An automatch player joins the game (CHECK)
9. An invited player starts playing (CHECK)
10. A remote user saves the game (CHECK)
*/
編輯:根據 μ4ρκ05 的反饋更新了“提醒”通知的狀態。
好的,您對各種方法的列表和解釋讓我開始思考。 首先。 收到匹配時沒有收到通知的問題對我來說是最緊迫的問題之一,因為如果您沒有收到通知,則意味着您將需要提取數據。 那么,什么時候再次加載比賽? 每 x 秒或每次帶有游戲列表的視圖控制器出現? 兩者都會發出不必要的網絡調用,這會很煩人,而且由於游戲列表可能需要重新加載,沒有任何實際更改,它可能看起來也不太好。 所以一開始我在考慮使用交換,這樣對手就可以得到通知並重新加載游戲。 但是,閱讀您的帖子我記得玩家收到了一個名為receivedTurnEventForMatch
player receives a reminder (UNTESTED)
。 現在,我設法通過初始化新游戲、輪流、然后發送提醒來讓對手收到新游戲的通知。
我已經更新了我的TurnBasedSkeleton項目。
我沒有足夠的聲譽來評論 Thunks 的回答,但我可以提交我自己的,所以這就是我將如何獲得這些信息的方式。 問題的最大部分是沒有關於如何使用此代碼的示例,並且缺少文檔。 因此,代碼未觸發並不能證明代碼已損壞,只是我們不知道如何使用它。
但是根據 Thunk 所做的陳述,我能夠得到 player:didModifySavedGame 和 player:hasConflictingSavedGames,他說他從未見過它們開火。
這些是 GKSavedGameListener 瘋狂的方法。 我遇到的這個協議的問題是它沒有分配給它的委托,所以我可以在我的程序中選擇任何類並使其符合這個協議,然后期望這些方法被觸發,這似乎不太可能。 所以我需要某種委托來說明哪個類符合。
我發現通過設置 localPlayer.registerListener(self),其中 self 是符合要求的類,我可以觸發它們。
因此,請仔細檢查未使用此集合觸發的任何方法,並讓我們知道它是否工作得更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.