iOS学习iOS 开发每天分享优质文章iOS Developer

BLE蓝牙ios(二)

2016-11-27  本文已影响79人  abigfishBegonia

今天我们来学习GameKit用法

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.13.19.png

这时候我们就可就可以点击模拟器上搜索到的iPhone,或者点击真机上搜索到的MacBookAir,进行数据传递了。

4.设置传递的数据,这里我们设置一张图片到imageView上,首先给imageView添加手势,点击imageView打开相册,选择相册一张图片后把此图设置到imageView上显示。

 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapaction)];
        [_imageView addGestureRecognizer:tap];
-(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>
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];
    

}

ok ,可以真机与模拟器之间相互传递数据了

上一篇下一篇

猜你喜欢

热点阅读