蓝牙通信,通过蓝牙传照片

蓝牙通信

  • GameKit(P2P)
  • ShowHand玩游戏

实现

连接对端

    -(void)connectPeer
    {
    // 1. 实例化一个对端选择视图控制器
    GKPeerPickerController *picker = [[GKPeerPickerController alloc]init];

    // 2. 设置代理
    [picker setDelegate:self];

    // 3. 显示视图控制器
    [picker show];
    }

对端选择器代理方法

完成对端连接

    - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
    {
    NSLog(@"连接已经建立");
    // session回话,一个完整的连接过程
    _gkSession = session;

    // 设置数据处理对象,类似于delegate
    [_gkSession setDataReceiveHandler:self withContext:nil];
    // 关闭选择器
        [picker dismiss];
    }   

发送照片

    - (void)sendPhoto
    { // 利用session发送数据

    NSData *imageData = UIImagePNGRepresentation(_imageButton.imageView.image);

    [_gkSession sendDataToAllPeers:imageData withDataMode:GKSendDataReliable error:nil];

    }

如果精通TCP协议、UDP协议

  1. 要发送的数据(二进制的)

  2. 数据发送模式

    • GKSendDataReliable :确保数据发送成功(TCP协议,对网络压力大)
    • GKSendDataUnReliable :只管发送不管成功(UDP协议,对数据完整性要求不高,对网络压力下)

接受照片

  • 数据接受处理方法,此方法需要从文档中粘贴出来,此智能提示没有

    - (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context
    { NSLog(@"数据接收");
    // 将NSData转换成UIImage,之所以能转换成UIImage是因为我们发送的就是UIImage
    UIImage *image = [UIImage imageWithData:data];
    
    //然后可以得到image对象
    //接着可以去存储或者显示在ImageView
    }
    

简单回顾

图片选择器

  • 选择照片
- (void)selectPhoto
{
    // 1. 首先判断照片源是否可用
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {

        // 0)实例化控制器
        UIImagePickerController *picker = [[UIImagePickerController alloc]init];
        // 1)设置照片源
        [picker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];

        // 2) 设置允许修改
        [picker setAllowsEditing:YES];
        // 3) 设置代理
        [picker setDelegate:self];
        // 4) 显示控制器
        [self presentViewController:picker animated:YES completion:nil];

    } else {
        NSLog(@"照片源不可用");
    }

}

ImagePicker代理方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *image = info[@"UIImagePickerControllerEditedImage"];
    [_imageButton setImage:image forState:UIControlStateNormal];

    // 关闭照片选择器
    [self dismissViewControllerAnimated:YES completion:nil];

    // 需要将照片保存至应用程序沙箱,由于涉及到数据存储,同时与界面无关
    // 可以使用多线程来保存图像
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // 保存图像
        // 1. 去图像路径
        NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *imagePath = [docs[0] stringByAppendingPathComponent:@"abc.png"];

        // 2. 转换成NSData保存
        NSData *imageData = UIImagePNGRepresentation(image);
        [imageData writeToFile:imagePath atomically:YES];
    });
}

你可能感兴趣的:(蓝牙)