2017-02-07 10 views
1

ここでは何度も説明した非常に古い問題に直面しました。多くの時間問題を話していたにもかかわらず、私は受け入れられる解決策が見つからなかったので、私は再び問題を提起することにしました。Game Center Sandboxの問題

だから、問題です。私はターンベースの試合を試してみようとしています。私はこれに2つの実際のデバイスを使用します。私は最初のデバイスをオンにし、一致データはエラーなしで更新されます(私は確かにそれを知っています)が、時には2番目のデバイスは通知を受信せず、最初のデバイスがまだターンに入っているようです。場合によっては期待どおりに動作します。

つまり、player(_:receivedTurnEventFor:didBecomeActive)というメソッドが呼び出されないことがあります。しかし、私が2番目のデバイスのアプリケーションを閉じると、再び開き、既存のマッチに参加するとすべて正常に動作します。 これはGame Center Sandboxのよく知られた問題ですが、アプリをテストしようとしているうちに私は狂っています。 回避策の方法を知っている人はいますか?または、この奇妙なサンドボックスの動作でアプリを生きてテストする方法がベストプラクティスですか?

更新。 サンクが提案した方法は解決策です。私はそれをSwiftに書き直して、自分のゲームロジックに合わせて修正しました。 最初は、私はendTurn(withNextParticipants:turnTimeOut:match:completionHan‌​dler:)完了ハンドラでグローバル変数 var gcBugTimer: Timer

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

let interval = 3.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() 
} 
+0

、あなたはターン内のマッチデータを保存、または終了を参照しているだけで明確にするために、一緒にターン?どちらもさまざまな時に通知を破棄しています。 – Thunk

+0

私のゲームのロジックによれば、ターン内にデータを保存する必要はありません。ですから、私は 'endTurn(withNextParticipants:turnTimeOut:match:completionHandler:)'を呼ぶだけで終了します。そしてもう一度。時にはそれは私の期待どおりに動作します - 2番目のデバイスは送信直後にターンを受信し、時にはマッチデータを更新するためにマッチに再び参加する必要があります。 –

答えて

1

待っている間に確実に働いていた私が見つけた唯一の解決策は、手動で私の状態を再確認しました私のターンのために。 endTurnWithNextParticipantsの完了ハンドラでは、マッチデータを継続的にリロードするタイマーを設定しました。 localPlayerがアクティブプレーヤーになったかどうかを確認しました。もしそうなら、私はreceivedTurnForEvent自分自身を呼び出しました。さもなければ、私はタイマーを繰り返しました。そのような:

 float dTime = 60.0;  //messages sometimes fail in IOS8.4 
     if (SYSTEM_VERSION_EQUAL_TO(@"8.3")) 
     { 
      dTime = 5.0;  //messages always fail in IOS8.3 
     } 
     IOS8BugTimer = [NSTimer scheduledTimerWithTimeInterval:dTime 
                  target:gameKitHelper 
                  selector:@selector(isMatchActive:) 
                  userInfo:theMatch.matchID 
                  repeats:NO]; 

とgameKitHelperで

:isMatchActive: endTurnWithNextParticipants完了ハンドラで

-(void)isMatchActive:(NSTimer *)timer 
{ 

    NSString *matchID = (NSString *)timer.userInfo; 
    [GKTurnBasedMatch loadMatchWithID:matchID withCompletionHandler:^(GKTurnBasedMatch *match, NSError *error) 
    { 
     GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
     GKTurnBasedParticipant *currentParticipant = match.currentParticipant; 

     if ([localPlayer.playerID isEqualToString:currentParticipant.player.playerID]) 
     { 
      //we have become active. Call the event handler like it's supposed to be called 
      [self player:localPlayer receivedTurnEventForMatch:match didBecomeActive:false]; 
     } 
     else 
     { 

      //we are still waiting to become active. Check back soon 
      float dTime = 60.0; 

      if (SYSTEM_VERSION_EQUAL_TO(@"8.3")) 
      { 
       dTime = 5.0; 
      } 

      gameController.IOS8BugTimer = [NSTimer scheduledTimerWithTimeInterval:dTime 
                     target:self 
                    selector:@selector(isMatchActive:) 
                    userInfo:matchID 
                     repeats:NO]; 
     } 
    }]; 

} 
+0

アドバイスをいただき、ありがとうございます。もう一つの質問。リリース後に私のコードは正常に動作しますか?または、通常のGameCenterでもステータスを再確認する必要がありますか? –

+0

アップルによれば、もはや別のサンドボックスはありません。私はアップルがドキュメンテーションを更新したとは思わないが、このリンクはオリジナルの発表を記述し、同じプロダクトサーバへの開発コードの動きにいくつかの賛否両論を与える:http://news.softpediacom/news/apple-removed-game-center-sandbox-migrates-test-servers-to-release-environment-493807.shtmlを参照してください。私が見たことから、あなたはテスト中に見たリリース後も同じ動作を期待するべきです。 – Thunk

+0

本当にうまくいきます。私はあなたのコードに基づいて私の最初の質問を更新しました。 –

関連する問題