由于某些原因,当在实时比赛中弹出 iOS 警报样式通知(消息、警报等)时,比赛将停止接收来自对手的数据。应用程序本身可以运行,但玩家之间没有数据传输。
委托(delegate)没有收到来自match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state
或authenticationChanged
的回调,所以它看来这两名球员仍然与比赛保持联系。
无论用户是关闭还是打开警报样式通知,都会出现此问题。
关于为什么/如何发生这种情况以及我如何预防/恢复的任何想法?
最佳答案
经过数小时的调试、研究和挫败,我发现了我的问题。
由于断开连接和退出事件状态很可能是移动设备和游戏中心的事件,因此我使用数据队列发送消息。它的工作原理是将当前消息堆叠在队列中(如果它是唯一的消息,则发送该消息)并运行以下数据传输步骤:1)发送队列中最旧的消息,2)等待对方接收确认,3)删除最旧的消息来自队列的消息,4) 如果队列计数仍然 > 0,发送队列中最早的消息...
然而,对于某些数据类型,我们希望绕过队列并且不要求接收确认。一个这样的例子是当我们向对手发送有关应用程序通知 UIApplicationWillResignActiveNotification
和 UIApplicationDidBecomeActiveNotification
的消息时。然而,即使消息没有要求回执确认,我也忘了绕过队列。由于对手从未发回回执确认,UIApplicationWillResignActiveNotification
消息无限期地阻塞队列。
我适本地绕过了队列,游戏现在可以毫无问题地恢复。如果有人想查看涉及的实际代码,我很乐意分享。
关于iphone - 警报式 iOS 通知(如消息)导致实时 Game Center 匹配停止接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15169207/