1

出于某种原因,当在实时比赛期间弹出 iOS 警报样式通知(消息、警报等)时,比赛将停止接收来自对手的数据。该应用程序本身功能,但没有玩家之间的数据传输。

代表没有收到来自match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state或的回叫authenticationChanged,因此看起来两个玩家都仍然连接到比赛。

无论用户关闭警报样式通知还是打开它,都会出现此问题。

关于为什么/如何发生这种情况以及如何预防/从中恢复的任何想法?

4

1 回答 1

1

经过数小时的调试、研究和挫折,我遇到了我的问题。

由于断开连接和主动退出活动可能是移动设备和游戏中心的事件,因此我使用数据队列来发送消息。它的工作原理是将当前消息堆叠在队列中(如果它是唯一消息,则发送消息)并运行以下数据传输步骤:1)发送队列中最旧的消息,2)等待对方收到确认,3)删除最旧的消息来自队列的消息,4) 如果队列计数仍然 > 0,则发送队列中最旧的消息...

但是,对于某些数据类型,我们希望绕过队列而不要求确认收据。一个这样的例子是当我们向对手发送有关应用程序通知UIApplicationWillResignActiveNotificationUIApplicationDidBecomeActiveNotification. 但是,即使消息没有要求确认收据,我也忘了绕过队列。由于对方从未发回收据确认,因此该UIApplicationWillResignActiveNotification消息无限期地阻塞了队列。

我适当地绕过了队列,游戏现在恢复正常。如果有人想查看所涉及的实际代码,我将很乐意分享。

于 2013-03-03T04:47:56.550 回答