我正在尝试实现P2P应用程序。我尝试做的是在设备之间传输自定义NSObject类的数据。我无法弄清楚GKSession何时调用“receivedData”方法。
这就是我做过的事情
通常的连接并显示一个带有同伴的对话框
当应用程序收到对等体的状态更改并且状态为已连接时,我将使用NSCoding方法将数据发送到所有对等体(理想情况下,应在每个对等体接受连接时调用)
在receivedData中,我正在解码NSData并返回NSObject实例
问题是会话:peer:didChangeState:方法未在两个设备上调用。它只是在设备上调用,该设备点击了PeerPicker警报中的“连接”按钮。
问题
什么时候调用didChangeState并为谁调用?在连接时,不应该为每个对等体调用它吗?
何时调用receiveData:方法并为谁调用?是否要求确认收到消息(握手)或仅传输其他同行发送的数据?
感谢您的帮助。
答案 0 :(得分:4)
将其视为“主/从”而不是“点对点”。据推测,双方都已经与GameKit建立并分配了他们的代表。启动连接的一方通过GKPeerStateConnected
状态更改值得到通知,接收方已接受邀请并已建立连接,因此可以开始发送内容。
然而,接收方首先注意到有人想通过didReceiveConnectionRequestFromPeer
委托方法与之交谈。它会保存会话供以后使用,然后转身并调用acceptConnectionFromPeer
接受它。从那时起,它将获得通过receiveData
方法发送的任何内容。
执行此操作的最佳方法是使用一个小型状态机来管理每一方所处的状态。发送方仅在获得GKPeerStateConnected
事件时发送。一旦接收器接受连接请求,接收器就会进入connected
状态,因此它可以在开始获取数据之前进行任何需要进行的设置。
由于网络抽象是GKSession
,接收者可以转而使用它在didReceiveConnectionRequestFromPeer
中获得的相同会话实例,并使用它回写给发送者(谁应该拥有自己的receiveData
用来自接收者的响应调用的方法。
要记住的一件事是,您可以通过GameKit发送缓冲区的隐含数据大小限制。您可能想要尝试找到适合您系统的内容(我得到的介于5K和10K之间 - 由于某种原因它会有所不同)。您可能希望使用代码将NSData拆分为块并管理打包/解包数据。