参考博客http://www.cnblogs.com/kenshincui/p/4220402.html#bluetooth
忙中偷闲,看到上面博客不错,正想没接触过蓝牙,话说好记性不如烂笔头,于是参照上述博客跟着敲了个Demo,在此总结一下关于对蓝牙传输的认识。
首先是基于GameKit框架的GKPeerPickerController以及GKSession.此用法已经不被苹果推荐,在iOS7以后苹果就不鼓励用此方法了,原因是这种蓝牙技术只能适用于iOS与iOS设备之间,且必须在同一个应用下才可进行数据的通信传输。其次要在Xcode中Capabilities中将Game Center打开才能将两个设备连接。
GKPeerPickerController:蓝牙查找、连接用的视图控制器,通常情况下应用程序A打开后会调用此控制器的show方法来展示一个蓝牙查找的视图,一旦发现了另一个同样在查找蓝牙连接的客户客户端B就会出现在视图列表中,此时如果用户点击连接B,B客户端就会询问用户是否允许A连接B,如果允许后A和B之间建立一个蓝牙连接。
GKSession:连接会话,主要用于发送和接受传输数据。一旦A和B建立连接GKPeerPickerController的代理方法会将A、B两者建立的会话(GKSession)对象传递给开发人员,开发人员拿到此对象可以发送和接收数据。所谓的GKSession我个人理解即是整个会话的管理者。所有的链接都是围绕这个session来进行的。
具体方法在viewDidload中初始化一个GKPeerPickerController
GKPeerPickerController *pearPickerController=[[GKPeerPickerController alloc]init]; pearPickerController.delegate=self; [pearPickerController show];代理方法
#pragma mark - GKPeerPickerController代理方法 /** * 连接到某个设备 * * @param picker 蓝牙点对点连接控制器 * @param peerID 连接设备蓝牙传输ID * @param session 连接会话 */ -(void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session{ self.session=session; NSLog(@"已连接客户端设备:%@.",peerID); //设置数据接收处理句柄,相当于代理,一旦数据接收完成调用它的-receiveData:fromPeer:inSession:context:方法处理数据 [self.session setDataReceiveHandler:self withContext:nil]; [picker dismiss];//一旦连接成功关闭窗口 }
NSData *data=UIImagePNGRepresentation(self.imageView.image); NSError *error=nil; [self.session sendDataToAllPeers:data withDataMode:GKSendDataReliable error:&error]; if (error) { NSLog(@"发送图片过程中发生错误,错误信息:%@",error.localizedDescription); }然后蓝牙接收方法,首先必须在代理GKPeerPickerController方法中写
[self.session setDataReceiveHandler:self withContext:nil];
#pragma mark - 蓝牙数据接收方法 - (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context{ UIImage *image=[UIImage imageWithData:data]; self.imageView.image=image; UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); NSLog(@"数据发送成功!"); }