BLE蓝牙ios(二)

作者: abigfishBegonia | 来源:发表于2016-11-27 22:03 被阅读79次

    今天我们来学习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
    屏幕快照 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];
    
    • 实现手势调用方法,并签署相册协议<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];
        
    
    }
    

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

    相关文章

      网友评论

        本文标题:BLE蓝牙ios(二)

        本文链接:https://www.haomeiwen.com/subject/fkknpttx.html