BLE蓝牙ios(二)
今天我们来学习GameKit用法
-
逻辑
1.创建附近设备搜索框
2.设置提示框代理
3.调用方法展示提示框
4.实现代理方法
5.在代理方法中对传输数据进行处理 -
代码演示
1.在ViewController.m中导入
#import <GameKit/GameKit.h>
2.创建ui 搜索设备的btn、发送数据的btn、展示数据的imageView
<pre>
@property (nonatomic, strong) UIButton *clinkBtn;//建立连接
@property (nonatomic, strong) UIButton sendBtn;//发送数据
@property (nonatomic, strong) UIImageView imageView;//显示数据
@property (nonatomic, strong) GKSession session;/会话/
// 注意UI懒加载代码神略了哦
-(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self setUpSubViews];
}
-(void)setUpSubViews{
[self.view addSubview:self.clinkBtn];
[self.view addSubview:self.sendBtn];
[self.view addSubview:self.imageView];
}
</pre>
3.在clinkBtn的点击方法调用时创建附近设备的搜索提示框,并设置代理,并遵守协议<GKPeerPickerControllerDelegate>
-(void)clinkBtnAction{
//创建一个附近设备的搜索提示框
GKPeerPickerController *ppc = [[GKPeerPickerController alloc]init];//适配6.0,把版本号改成6.0,就不会再报警告
// 如果要搜索到设备,还要用到代理方法
ppc.delegate = self;
[ppc show];
}
此时,我们运行代码
屏幕快照 2016-11-27 下午3.19.14.png
点击按钮 建立连接
屏幕快照 2016-11-27 下午3.19.34.png
出现搜索设备的弹框,因为GameKit的局限性:
就是搜索设备功能只能搜索到 打开蓝牙 运行同一个app并点击 建立连接按钮的设备,所以此时我们运行在模拟器上的demo会一直处于搜索设备的状态
那么,我们把项目运行到真机上:让真机和模拟器进行数据传递。左边是真机,右边是模拟器。
屏幕快照 2016-11-27 下午9.11.00.png
-
此时,两边都点击建立连接
屏幕快照 2016-11-27 下午9.12.57.png
这时候我们就可就可以点击模拟器上搜索到的iPhone,或者点击真机上搜索到的MacBookAir,进行数据传递了。
4.设置传递的数据,这里我们设置一张图片到imageView上,首先给imageView添加手势,点击imageView打开相册,选择相册一张图片后把此图设置到imageView上显示。
- 添加手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapaction)];
[_imageView addGestureRecognizer:tap];
- 实现手势调用方法,并签署相册协议<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
-(void)tapaction{
// 判断是否支持相册选择
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
NSLog(@"木有相册");
return;
}
//创建选择相片的控制器
UIImagePickerController *pic = [[UIImagePickerController alloc]init];
pic.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
pic.delegate = self;
[self presentViewController:pic animated:YES completion:nil];
}
-
实现相册代理方法
<pre>
// 图片选择完之后调用的方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{[picker dismissViewControllerAnimated:YES completion:nil];
NSLog(@"%s,line = %d,info = %@",func,LINE,info);
//把图片设置到imageView上显示
self.imageView.image = info[UIImagePickerControllerOriginalImage];
}
</pre>
5.实现点击 发送按钮方法 sendBtn;//发送数据
-(void)sendBtnAction{
//第一步判断要发送的数据是否存在
if (!self.imageView.image) return;
// 发送数据
// [self.session sendData:UIImagePNGRepresentation(self.imageView.image) toPeers:<#(NSArray *)#>//已经连接的所有设备
// withDataMode:<#(GKSendDataMode)#> error:<#(NSError *__autoreleasing *)#>]
NSError *error = nil;
BOOL sendState = [self.session sendDataToAllPeers:UIImagePNGRepresentation(self.imageView.image)
withDataMode:GKSendDataReliable//GKSendDataReliable可靠地传输方式,慢,不会丢包,直到传完,传递的信息完整;GKSendDataUnreliable快,丢包,可能传不完,信息可能不完整
error:&error];
if (!sendState) {
NSLog(@"%@",error.localizedDescription);
}
}
6.处理数据传递,实现代理方法
#pragma mark - GKPeerPickerControllerDelegate
//最长用的方法,已经成功连接到某个设备,并且开启了连接会话
- (void)peerPickerController:(GKPeerPickerController *)picker //搜索框
didConnectPeer:(NSString *)peerID //设备id,连接的设备
toSession:(GKSession *)session //连接会话,通过会话可以通过数据传输
{
NSLog(@"%s,line = %d",__func__,__LINE__);
// 1. 首先让搜索弹框消失
[picker dismiss];
// 2. 记录会话信息
self.session = session;
// 3.传输数据
//4.设置接收数据,设置完接受者之后,接收数据会触发方法receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context 现在苹果已经把这个方法干掉,就是告诉用户不要用这个框架了;现在我们只是了解学习
[self.session setDataReceiveHandler:self withContext:nil];
}
// 设置接收数据,设置完接受者之后,接收数据会触发此方法,现在苹果已经把此方法干掉,就是告诉用户不要用这个框架了;现在我们只是了解学习
- (void)receiveData:(NSData *)data//数据
fromPeer:(NSString *)peer//来自哪个设备
inSession:(GKSession *)session//连接会话
context:(void *)context//
{
NSLog(@"%s,line = %d,data = %@,peer = %@,session = %@",__func__,__LINE__,data,peer,session);
// 将接收的数据展示在屏幕上
self.imageView.image = [UIImage imageWithData:data];
}