如何使用GameKit
第一部分
Peer-to-Peer的连接
Session:会话iPhone通过Session互相发送数据读取数据
Peer:每一部网络中的设备算一个节点
第一节 发现其他的节点:
会话要么把自己当成 服务器/客户端 中的一种,要么做一个节点即当服务器又当客户端
1. 实现一个Server
initWithSessionID:displayName:sessionMode:GKSessionModeServer|GKSessionModePeer
服务器收到客户请求后,回调 session:didReceiveConnectionRequestFromPeer:
委托类 接受请求
acceptConnectionFromPeer:error:
委托类 拒绝请求
denyConnectionFromPeer:
成功建立连接后:回调委托类函数:session:peer:didChangeState
2. 连接到一个服务
initWithSessionID:displayName:sessionMode: GKSessionModeClient|GKSessionModePeer
发现可用的服务后,回调委托类函数:session:peer:didChangeState: 提供自己的PeerID
发送请求:connectToPeer:withTimeout
成功建立连接:回调:session:peer:didChangeState
第二节 交换数据
1. 发送:
sendDataToAllPeers:withDataMode:error:
sendData:toPeer:withDataMode:error
2. 接受:
receiveData:fromPeer:inSession:context:
setDataReceivehandler:withContext:
第三节
断开节点:
disconnectPeerFromAllPeers:
回调:session:peer:didChangeState:
第四节 清理:
移除数据处理器并释放会话
第二部分
添加一个节点选择器
1. 创建并初始化一个GKPeerPicerController
picker = [[GKPeerPickerController alloc] init];
2. 附加委托
picker.delegate = self;
3. 配置可选网络 ( 默认蓝牙 )
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby |
GKPeerPickerConnectionTypeOnline;
4. 若选择因特网连接,实现:
- (void)peerPickerController:(GKPeerPickerController *)picker
didSelectConnectionType:(GKPeerPickerConnectionType)type{
if (type == GKPeerPickerConnectionTypeOnline) {
picker.delegate = nil;
[picker dismiss];
[picker autorelease];
//implement your own internet user inter face here
}
}
5. 实现委托的节点选择器
peerPickerController:(GKPeerPickerControlller *)picker
sessionForConnectionType:(GKPeerPickerConnectionType)type
{
GKSession* session = [[GKSession alloc]] initWithSessionID:myExampleSessionID displayName:myName sessionMode:GKSessionModePeer] ;
[session autorelease];
}
//在覆盖节点选择器的原有方法时实现此方法。
6. 实现委托的peerPickerController:didConnectPeer:toSession:方法获得对配置好的session的所有权。
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:( NSString *)peerID toSession: (GKSession *)season{
// 使用Retain过的属性拥有这个session
self.gameSession = self;
// 假设我们的对象同样是委托类
session.delegate = self;
[session setDataReceiveHandler: self withContext:nil];
//除掉picker
picker.delegate = nil;
[picker dismiss];
[picker autorelease];
//开始你的游戏
}
7.实现取消连接的代理方法
- (void) peerPickerControllerDidCancel:(GKPeerPickerController *)picker
{
picker.delegate = nil;
//控制器自动取消对话界面
[picker autorelease];
}
8. 显示对话
[picker show];
第三部分
使用Sessions
1. 实现 会话代理的方法:session:didChangeState:
- (void) session:(GKSession *)session peer:(NSString *)peerID
didChangeState:(GKPeerConnectionState)state
{
switch ( state)
{
case GKPeerStateConnecte:
// 相关代码
break;
case GKPeerStateDisconnected:
//相关代码
break;
}
}
2. 发送数据到其他Peer
- (void) mySendDataToPeers: (NSData *)data
{
[session sendDataToAllPeers: data withDataMode: GKSendDataReliable error: nil];
}
3. 从其他节点接收数据
- (void) receiveData:(NSData *)data fromPeer: (NSString *)peer inSession:
(GKSession *)session context:(void *)context
{
//读取数据
}
4. 清除会话
[session disconnectFromAllPeers];
session.availabel = NO;
[session setDataReceiveHandler: nil withContext: nil];
session.delegate = nil;
[session release];
摘自:http://hi.baidu.com/b_a_d_b_u_k/blog/item/f326051152c85f75cb80c4d8.html
iphone蓝牙通信GameKit框架
GameKit框架中蓝牙传输主要用到的2个类
GKPeerPickerController
GKSession
通过GKPeerPickerController 提供了UI界面picker,我们也可以自定义界面。
如同其它的框架一般,APPLE提供了功能强大的代理。
蓝牙传输需要使用的2个代理是:
GKPeerPickerControllerDelegate
GKSessionDelegate
iPhone OS 3.0的最佳功能是GameKit框架,这个框架包括了允许基于蓝牙网络进行通信的API,你可以更轻松地创建点到点的游戏和应用程序。与其它移动平台不一样,在iPhone中使用蓝牙作为一个通信信道比预期的要容易得多,因此,本文将向你展示如何构建一个简单的应用程序,实现iPhone和iPod之间的相互通信。