簡體   English   中英

Gamecenter ios 9 GameCenter GKLocalPlayerListener 方法未調用

[英]Gamecenter ios 9 GameCenter GKLocalPlayerListener methods not called

這是關於GameCenter的。

由於“ GKLocalPlayerListener協議繼承了GKChallengeListenerGKInviteEventListenerGKTurnBasedEventListener的方法。

為了處理多個事件”和“不要直接實現GKChallengeListenerGKInviteEventListenerGKTurnBasedEventListener 改為實施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 是符合要求的類,我可以觸發它們。

因此,請仔細檢查未使用此集合觸發的任何方法,並讓我們知道它是否工作得更好。

你沒有遺漏任何東西。 蘋果選擇了

刪除[這些]功能[s]

我打開了一個提交給 Apple 的錯誤以進一步調查。 至少可以說,他們的反應並不令人滿意。

蘋果錯誤報告

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM