2017-06-17 7 views
0

呼び出されないGKTurnBasedEventListener機能がベースの試合を回し、私は通知を受信するとiOSのターンベースの試合、動作していない通知をプッシュする私のIOSで

public func player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool) 

は成功しません、と呼ばれるように取得しようとしています。

は、私は地元のプレーヤー

GKLocalPlayer.localPlayer().register(self) 

に私の見解モデルを登録し、他のプレイヤーが

func endTurn(withNextParticipants nextParticipants: [GKTurnBasedParticipant], turnTimeout timeout: TimeInterval, match matchData: Data, completionHandler: ((Error?) -> Swift.Void)? = nil) 

が、ノー成功を実行した後、私はそれが火に期待します。

強制的にmatchDataをリロードすると、2番目のプレイヤーが送信したデータが取得されます。したがって、endTurnは正しく動作します。

私が間違っていることはありますか?

更新: 私は新しいプロジェクトを作成し、すべてのファイルを にコピーしました.Game Centerのみが有効でした。

それが完璧に動作していたとき、2つのデバイスが接続されていました(リンゴIDが異なる)。通知が機能し、Turnbasedlistenerが発砲していました。

私が内部テスト用にリリースすると、すぐに動作を停止しました!

+0

、あなたのアプリケーションダブルチェックがありますが、「設定」の下にプッシュ通知を可能に?ユーザーがプッシュ通知を有効にしないと決定した場合、「receivedTurnEventFor」は呼び出されません。 –

+0

はい、プッシュ通知が有効になっています(バッジ) – tallis

+0

新しいプロジェクトを作成し、すべてのファイルをコピーしました.Game Centerのみが有効になっています。開発が完璧だったとき、2つのデバイスが接続されていました(リンゴIDが違う)。通知が機能し、Turnbasedlistenerが発砲していました。私はそれを内部テストのためにリリースすると、すぐに動作を停止しました! – tallis

答えて

0

私は非常に似た問題を抱えていました。私の解決策は、自分のターンを待っている間に自分のステータスを手動で再確認することでした。 最初は、私はendTurn(withNextParticipants:turnTimeOut:match:completionHan‌​dler:)完了ハンドラでグローバル変数var gcBugTimer: Timer

定義:プレイヤーが順番に新しい一致し、他のプレイヤーにjoyingされたときにも、上記

let interval = 5.0 
self.gcBugTimer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(self.isMatchActive), userInfo: nil, repeats: true) 
self.gcBugTimer.tolerance = 1.0 

コードがケースに呼び出されなければなりません。その後

タイマー方法:

func isMatchActive() { 
    // currentMatch - global variable contains information about current match 
    GKTurnBasedMatch.load(withID: currentMatch.matchID!) { (match, error) in 
    if match != nil { 
     let participant = match?.currentParticipant 
     let localPlayer = GKLocalPlayer.localPlayer() 
     if localPlayer.playerID == participant?.player?.playerID { 
     self.player(localPlayer, receivedTurnEventFor: match!, didBecomeActive: false) 
     } 
    } else { 
     print(error?.localizedDescription ?? "") 
    } 
    } 
} 

そして、私はplayer(_:receivedTurnEventFor:didBecomeActive)の先頭に次のコードを追加します。

if gcBugTimer != nil && gcBugTimer.isValid { 
    gcBugTimer.invalidate() 
} 
関連する問題