GameKit 蓝牙

gameKit 只用于iOS设备间的同个应用连接, 多由于游戏 在iOS7之后过期

gameKit 的使用过程主要可以分为四步:

1.创建一个GKPeerPickerController 对象 这个对象用来搜索附近的设备(类似alertView).

 2.设置GKPeerPickerController 的代理 用于连接的回调

 3.在 (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session 代理方法中保存 session 以备 后续发送数据使用 并且在这个方法中设置session的 接收数据的 句柄 [self.session setDataReceiveHandler:self withContext:nil];  这样接收的数据只有系统会自动地用- (void)receiveData:(NSData *)data   fromPeer (NSString *)peer inSession:(GKSession *)session context:(void *)context ; 方法 用于处理发送的数据

4. 使用 session 发送数据  

BOOL sendState = [self.session sendDataToAllPeers:UIImagePNGRepresentation(self.iconView.image) withDataMode:GKSendDataReliable error:&error];

实现过程:

a.建立连接  b.选择数据  c.发送

首先布局一个简单的界面:

 

@interface ViewController () <GKPeerPickerControllerDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *iconView;

/** 会话 */
@property (nonatomic, strong) GKSession *session;
@end

 

实现代码

 a. 建立连接   创建GKPeerPickerController 对象 并设置代理

// 建立连接
- (IBAction)lineClick:(UIButton *)sender {
   
    // 1.创建一个附近设备的搜索提示框(类似alert)
    GKPeerPickerController *pic = [[GKPeerPickerController alloc] init];
    
    // 设置代理
    pic.delegate = self;
    
    [pic show];
    
}

在选中了要连接的设备后会调用 GKPeerPickerController的代理方法

连接成功后调用的代理方法为:

#pragma mark - <GKPeerPickerControllerDelegate>

- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
    
    
    // 保存会话
    self.session = session;
    
    // 设置接收数据
    // 设置完接受者之后,接收数据会触发 -receiveData:fromPeer:inSession:context
    [self.session setDataReceiveHandler:self withContext:nil];

}

在代理方法中保存连接的session, 并设置session接收数据的句柄,这样在接收数据时就可以调用下面的方法 

#pragma mark - 蓝牙设备接收到数据时,就会调用

- (void)receiveData:(NSData *)data // 数据
           fromPeer:(NSString *)peer // 来自哪个设备
          inSession:(GKSession *)session // 连接会话
            context:(void *)context {

    self.iconView.image = [UIImage imageWithData:data];
}

b.选中数据 (以图片为例)

// 选中图片
- (IBAction)pick:(UIGestureRecognizer *)sender {
    
    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
     
        return;
    }
    
    // 创建图片库
    UIImagePickerController *pc = [[UIImagePickerController alloc] init];
    
    // 设置源
    pc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    
    // 设置代理
    pc.delegate = self;
    
    [self presentViewController:pc animated:YES completion:nil];
    
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

    // 消失pc
    [picker dismissViewControllerAnimated:YES completion:nil];
    
    self.iconView.image = info[UIImagePickerControllerOriginalImage];
    
}

c.发送数据 

// 发送数据
- (IBAction)sendClick:(UIButton *)sender {
    
    // 可靠的传输方式特点:1慢 2.不会丢包 3.直到传完  GKSendDataUnReliable 可靠的传输方式特点:1快 2.可能会丢包 3.传递的信息不一定完整
    NSError *error = nil;
    BOOL sendState = [self.session sendDataToAllPeers:UIImagePNGRepresentation(self.iconView.image) withDataMode:GKSendDataReliable error:&error];
    
    if (!sendState) {
        NSLog(@"error = %@", error.localizedDescription);
    }
}

 

发送数据 对方就会调用下面发方法 :

- (void)receiveData:(NSData *)data // 数据

           fromPeer:(NSString *)peer // 来自哪个设备

          inSession:(GKSession *)session // 连接会话

            context:(void *)context {

 

    self.iconView.image = [UIImage imageWithData:data];

}

转载于:https://my.oschina.net/u/2433349/blog/861461

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值