面试题答案
一键面试GKSession的角色
GKSession在Objective - C的GameKit多人游戏开发中扮演着管理设备间连接和数据传输的角色。它提供了一种机制,让多个iOS设备(或与Mac设备)能够建立连接并交换数据,以实现多人游戏功能。它负责处理设备发现、连接建立、会话管理以及数据发送和接收等方面。
使用GKSession进行设备间连接的主要步骤:
- 创建GKSession实例:
GKSession *session = [[GKSession alloc] initWithSessionID:nil displayName:nil sessionMode:GKSessionModePeer];
在这里,sessionID
如果为nil
,系统会自动生成一个唯一的标识符。displayName
可以是本地设备在会话中的显示名称,sessionMode
指定会话模式,GKSessionModePeer
表示对等模式,即每个设备都可以发起和接收连接。
2. 设置代理:
session.delegate = self;
代理需要遵循GKSessionDelegate
协议,通过代理方法来处理会话相关的事件,如连接成功、失败,以及接收到数据等。
3. 配置会话属性:
session.available = YES;
session.disconnectTimeout = 60;
available
属性设置为YES
表示该会话可以被其他设备发现并连接。disconnectTimeout
设置连接在无活动状态下的超时时间(单位为秒)。
4. 发现附近设备:
[session setDataReceiveHandler:self withContext:nil];
这一步设置数据接收处理程序,用于接收其他设备发送的数据。同时,设备开始广播自己的存在,以便附近的其他设备可以发现它。 5. 发起连接或接受连接:
- 发起连接:如果是主动发起连接,通过
[session connectToPeer:peerID withTimeout:timeout]
方法,其中peerID
是目标设备的标识符,timeout
是连接超时时间。 - 接受连接:当有其他设备发起连接请求时,代理方法
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state
会被调用,在这个方法中根据state
判断连接状态,如果是GKPeerStateConnected
,则表示连接成功。
- 数据传输:
连接建立后,可以通过
[session sendData:data toPeers:peers withDataMode:GKSessionSendDataReliable]
方法来发送数据。data
是要发送的数据对象,peers
是目标设备的标识符数组,GKSessionSendDataReliable
表示可靠传输模式,数据会确保被送达,但可能会有一定延迟。接收数据则在之前设置的数据接收处理程序中进行处理。 - 结束会话:
当游戏结束或需要断开连接时,调用
[session disconnectFromAllPeers]
方法断开与所有设备的连接,并释放GKSession
实例。
[session release];