注册 登录
主题 : 学习GameKit
级别: 精灵王

UID: 103898
精华: 1
发帖: 1406
可可豆: 13025 CB
威望: 12885 点
在线时间: 229(时)
注册时间: 2011-11-11
最后登录: 2018-11-14
0 楼:  发表于: 2012-03-28 00:42    发自: Web Page

学习GameKit   

如何使用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之间的相互通信。
  注意:如果要测试本文所介绍的内容,需要两部iPhone(3G或3GS),或使用iPhone OS 3.0或更高版本的iPod设备(二代或更新版本)。
  创建一个项目
   使用Xcode,创建一个新的基于视图的应用程序项目,取名为Bluetooth。访问蓝牙的各种API位于GameKit框架中,因此,你需要将这个 框架添加到刚刚创建的项目中,在Xcode的框架组上点右键,选择“添加”*“现有框架”,选择GameKit框架,
  在BluetoothViewController.h文件中,声明下面的对象,outlet和行为:


#import
#import
@interface BluetoothViewController : UIViewController

{
GKSession *currentSession;
IBOutlet UITextField *txtMessage;
IBOutlet UIButton *connect;
IBOutlet UIButton *disconnect;
}
@property(nonatomic, retain) GKSession *currentSession;
@property(nonatomic, retain) UITextField *txtMessage;
@property(nonatomic, retain) UIButton *connect;
@property(nonatomic, retain) UIButton *disconnect;
-(IBAction) btnSend:(id) sender;
-(IBAction) btnConnect:(id) sender;
-(IBAction) btnDisconnect:(id) sender;
@end


  GKSession对象用于表现两个蓝牙设备之间连接的一个会话,你也可以使用它在两个设备之间发送和接收数据。
  在BluetoothViewController.m文件中,添加下面的代码:

#import "BluetoothViewController.h"2 3 #import
@implementation BluetoothViewController
@synthesize currentSession;
@synthesize txtMessage;
@synthesize connect;
@synthesize disconnect;
 


  双击BluetoothViewController.xib在Interface Builder中编辑它,在视图窗口中添加以下视图,如图2所示。
  文本区域(Text Field)
  圆形按钮(Round Rect Button)


  图 2在视图窗口中填充文本区域和圆形按钮视图
  连接outlets 和 actions


  图 3 验证所有连接是否正常
  返回Xcode,在BluetoothViewController.m文件中,添加以下代码:


-(void)viewDidLoad

{
[connect setHidden:NO];
[disconnect setHidden:YES];
[super viewDidLoad];
}
-(void)dealloc {
[txtMessage release];
[currentSession release];
[super dealloc];
}
 


  搜索对等设备
  现在所有准备工作已经就绪,接下来介绍一下访问其它蓝牙设备的API。
  在BluetoothViewController.h文件中,声明一个GKPeerPickerController对象:

#import "BluetoothViewController.h"2 3 #import
@implementation BluetoothViewController
@synthesize currentSession;
@synthesize txtMessage;
@synthesize connect;
@synthesize disconnect;
GKPeerPickerController *picker;
 


GKPeerPickerController类提供了一个标准的UI让你的应用程序发现并连接到其它蓝牙设备,连接方法并不难,首先实现一个btnConnect:类:


-(IBAction) btnConnect:(id) sender 

{
picker =[[GKPeerPickerController alloc] init];
picker.delegate =self;
picker.connectionTypesMask =GKPeerPickerConnectionTypeNearby;
[connect setHidden:YES];
[disconnect setHidden:NO];
[picker show];
}
 


   connectionTypesMask属性指出用户可以选择的连接类型,包括两种类 型:GKPeerPickerConnectionTypeNearby和GKPeerPickerConnectionTypeOnline。对于蓝牙 通信,使用GKPeerPickerConnectionTypeNearby常量,GKPeerPickerConnectionTypeOnline 常量表示基

检测到远程蓝牙设备,用户选择并连接到其中一个蓝牙设备时,调用peerPickerController:didConnectPeer:toSession:方法,这个方法的下:


-(void)peerPickerController:(GKPeerPickerController *)picker
didConnectPeer:(NSString *)peerID
toSession:(GKSession *) session {
self.currentSession =session;
session.delegate =self;
[session setDataReceiveHandler:self withContext:nil];
picker.delegate =nil;
[picker dismiss];
[picker autorelease];
}
 


  当用户已经连接到对等蓝牙设备后,可以将GKSession对象保存到currentSession属性中,这样你可以使用GKSession对象与远程设备通信。
  如果用户取消了蓝牙选择器,调用peerPickerControllerDidCancel:方法,其定义如下:


-(void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker
{
picker.delegate =nil;
[picker autorelease];
[connect setHidden:NO];
[disconnect setHidden:YES];
}
 


  如果要从一个设备断开连接,使用来自GKSession对象的disconnectFromAllPeers方法,btnDisconnect:方法的实现如下:

-(IBAction) btnDisconnect:(id) sender
{
[self.currentSession disconnectFromAllPeers];
[self.currentSession release];
currentSession =nil;
[connect setHidden:NO];
[disconnect setHidden:YES];
}
 


 
 连接设备或断开连接时,调用session:peer:didChangeState:方法,其实现如下:
-(void)session:(GKSession *)session
peer:(NSString *)peerID
didChangeState:(GKPeerConnectionState)state

{
switch (state)
 {
caseGKPeerStateConnected:
NSLog(@"connected");
break;
caseGKPeerStateDisconnected:
NSLog(@"disconnected");
[self.currentSession release];
currentSession =nil;
[connect setHidden:NO];
[disconnect setHidden:YES];
break;
}
}
 


  处理这个事件你将知道连接是什么时候建立的,或断开是什么时候发生的。例如,当建立一个连接时,你可能想要立即向对方发送数据。
  发送数据
   为了向连接的蓝牙设备发送数据,需要使用到GKSession对象的sendDataToAllPeers:方法,你发送的数据是通过NSData对象 传输的,因此你可以自定义你的应用程序协议和发送的数据类型(如二进制数据),mySendDataToPeers:方法的定义如下:
-(void) mySendDataToPeers:(NSData *) data
{
if(currentSession)
[self.currentSession sendDataToAllPeers:data
withDataMode:GKSendDataReliable
error:nil];
}
再定义btnSend:方法,以便用户输入的数据能够发送到远程设备:
-(IBAction) btnSend:(id) sender
{
//---convert an NSString objecttoNSData---22 23 NSData*data;
NSString *str =[NSString stringWithString:txtMessage.text];
data =[str dataUsingEncoding: NSASCIIStringEncoding];
[self mySendDataToPeers:data];
}
 


  接收数据
  当设备接收到数据时,调用receiveData:fromPeer:inSession:context:方法,其实现如下:
-(void) receiveData:(NSData *)data
fromPeer:(NSString *)peer
inSession:(GKSession *)session
context:(void *)context {
//---convert the NSData toNSString---10 11 NSString*str;
str =[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
UIAlertView *alert =[[UIAlertView alloc] initWithTitle:@"Data received"16 17 message:str
delegate:self
cancelButtonTitle:@"OK"22 23 otherButtonTitles:nil];
[alert show];
[alert release];
}
 


  这里接收到的数据是NSData格式,为了使用UIAlertView类显示它,你需要将其转换为NSString对象。

测试应用程序
  就是这么简单!现在可以开始测试了,在Xcode中按下Command-R,将程序部署到iPhone/iPod上,本文假设你有两部iPhone或两部iPod,为了运行刚刚创建的程序,这两台设备上都需要运行iPhone OS 3.0。
  部署好程序后,在两台设备上启动好程序,在任一设备上点击连接按钮,GKPeerPickerController将会显示标准的UI发现其它设备,如图4所示。

图 4 GKPeerPickerController查找其它设备
等待一会儿后,两边的程序应该都能够发现对方,如图5所示,当你在发现的设备名称上轻轻点击,程序就会开始连接。

  图 5 显示发现的设备名称
  注意:如果你在iPhone模拟器上测试这个程序,应该会检测到两个设备,但却无法连接到任何设备。
  当其它设备试图连接到你的设备时,你将会看到如图6所示的弹出提示,点击“接受”允许其连接,点击“拒绝”拒绝其连接。

  图 6 其它设备试图连接到你时的提示
  如果成功与你建立了连接,你就可以输入一些文本信息发给对方了,从其它设备接收到数据将会以一个警告视图显示,如图7所示。

图 7 接收到其它设备发来的数据


摘自http://blog.163.com/kongshuai1234@126/blog/static/110366995201062683438307/

ANE与GameKit:http://www.adobe.com/cn/devnet/games/articles/ane_and_gamekit1_cn.html


学习GameKit,小收集下学习资料……,谢谢原作者们~~

[ 此帖被love在2012-03-28 00:59重新编辑 ]

关键词: GameKit
级别: 新手上路
UID: 26086
精华: 0
发帖: 38
可可豆: 290 CB
威望: 290 点
在线时间: 65(时)
注册时间: 2010-07-29
最后登录: 2014-11-01
1 楼:  发表于: 2012-03-28 07:18    发自: iPad
好东西,谢谢分享!
级别: 精灵王

状态: 连续签到 - [2天]
UID: 100174
精华: 0
发帖: 813
可可豆: 7136 CB
威望: 7234 点
在线时间: 1254(时)
注册时间: 2011-10-26
最后登录: 2018-11-15
2 楼:  发表于: 2012-03-28 08:30    发自: Web Page

级别: 骑士
UID: 71940
精华: 0
发帖: 227
可可豆: 1213 CB
威望: 1433 点
在线时间: 574(时)
注册时间: 2011-05-24
最后登录: 2018-10-25
3 楼:  发表于: 2012-03-28 08:38    发自: Web Page
好东西,谢谢分享!
级别: 新手上路
UID: 71014
精华: 0
发帖: 18
可可豆: 135 CB
威望: 135 点
在线时间: 28(时)
注册时间: 2011-05-20
最后登录: 2013-09-09
4 楼:  发表于: 2012-03-28 10:11    发自: Web Page

级别: 新手上路
UID: 108825
精华: 0
发帖: 17
可可豆: 125 CB
威望: 125 点
在线时间: 0(时)
注册时间: 2011-11-30
最后登录: 2013-09-09
5 楼:  发表于: 2012-03-28 10:15    发自: Web Page

级别: 新手上路
UID: 132974
精华: 0
发帖: 1
可可豆: 10 CB
威望: 10 点
在线时间: 0(时)
注册时间: 2012-03-28
最后登录: 2012-03-28
6 楼:  发表于: 2012-03-28 10:28    发自: Web Page

级别: 新手上路
UID: 95639
精华: 0
发帖: 33
可可豆: 285 CB
威望: 285 点
在线时间: 24(时)
注册时间: 2011-09-29
最后登录: 2013-09-12
7 楼:  发表于: 2012-03-28 10:30    发自: Web Page

级别: 骑士
UID: 82155
精华: 0
发帖: 185
可可豆: 1832 CB
威望: 1832 点
在线时间: 334(时)
注册时间: 2011-07-19
最后登录: 2016-01-08
8 楼:  发表于: 2012-03-28 13:21    发自: Web Page
mark 不错的技术资料
l]
级别: *
UID: 89375
精华: *
发帖: *
可可豆: * CB
威望: * 点
在线时间: (时)
注册时间: *
最后登录: *
9 楼:  发表于: 2012-03-30 10:48    发自: Web Page
4楼的二维码头像好牛x啊,扫完才发现

本站内容均为本站转发,已尽可能注明出处。因未能核实来源或转发内容图片有权利瑕疵的,请及时联系本站,本站会第一时间进行修改或删除。 QQ : 3442093904

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部