我有一个典型的GKSessionModeServer/GKSessionModeClient
设置。
当服务器拒绝与denyConnectionFromPeer:
的客户端连接尝试时,将调用客户端的session:connectionWithPeerFailed:
方法,但随后它将使用我的服务器的peerID接收GKPeerStateConnected
状态更改。换句话说,客户端认为连接成功,而服务器没有。
这似乎与常识和connectToPeer:withTimeout:
的文档不一致,后者说
如果与远程对等方的连接成功,则为其成功连接的每个对等方调用委托“
session:peer:didChangeState:
方法”。如果连接失败或您的应用程序取消了连接尝试,则会话将调用委托的session:connectionWithPeerFailed:withError:
方法。
我知道这并不是说在连接失败的情况下不会调用状态更改回调 ,但客户端的最终结果是连接失败似乎导致连接成功。
抓住吸管我尝试从cancelConnectToPeer
回调中调用connectionWithPeerFailed
,但没有结果。
客户端可以通过忽略下一个GKPeerStateConnected
来解决这个问题,但这很麻烦,当服务器再次开始接受连接时会重新连接。
那么为什么客户会话无法理解它已经结束了呢?
答案 0 :(得分:1)
我自己设计了相同类型的应用程序( GKSessionModeServer / GKSessionModeClient )。
当您拒绝与对等方的连接时,它将触发session:peer:didChangeState:
委托,并将GKPeerConnectionState参数设置为GKPeerStateDisconnected
。
你只需要在你的代码中正确处理这个问题 - 我从来没有对这个部分有任何问题。