zoukankan      html  css  js  c++  java
  • iOS 蓝牙的GameKit用法

    一、连接蓝牙

    • 显示可以连接的蓝牙设备列表
    - (IBAction)buildConnect:(id)sender {
        // 创建弹窗
        GKPeerPickerController *ppc = [[GKPeerPickerController alloc] init];
        // 设置代理  @interface ViewController () <GKPeerPickerControllerDelegate>
        ppc.delegate = self;
        // 展示
        [ppc show];
    }
    
    • 监听蓝牙的连接
    #pragma mark -GKPeerPickerControllerDelegate
    // 连接成功就会调用
    - (void)peerPickerController:(GKPeerPickerController *)picker // 弹窗
                  didConnectPeer:(NSString *)peerID // 连接到的蓝牙设备号
                       toSession:(GKSession *)session // 连接会话(通过它进行数据交互)
    {
        NSLog(@"%s, line = %d", __FUNCTION__, __LINE__);
        // 弹窗消失
        [picker dismiss];
    }
    

    二、利用蓝牙传输数据

    • 点击发送数据完成图片显示到另一个蓝牙机器上
      • 1.分析需要通过GKSession对象来传递数据,所以在peerPickerController:didConnectPeer:didConnectPeer:的方法中保存session会话
    @property (nonatomic, strong) GKSession *session; /**< 蓝牙连接会话 */
    
    // 连接成功就会调用
    - (void)peerPickerController:(GKPeerPickerController *)picker // 弹窗
                  didConnectPeer:(NSString *)peerID // 连接到的蓝牙设备号
                       toSession:(GKSession *)session // 连接会话(通过它进行数据交互)
    {
        NSLog(@"%s, line = %d", __FUNCTION__, __LINE__);
        // 弹窗消失
        [picker dismiss];
        // 保存会话
        self.session = session;
    }
    
    • 发送
    // 发送数据
    - (IBAction)sendData:(id)sender {
        if (self.imageView.image == nil) return; // 有图片才继续执行
        // 通过蓝牙链接会话发送数据到所有设备
        [self.session sendDataToAllPeers:UIImagePNGRepresentation(self.imageView.image) // 数据
                            withDataMode:GKSendDataReliable // 枚举:发完为止
                                   error:nil];
    
    }
    
    • 接收
    // 连接成功就会调用
    - (void)peerPickerController:(GKPeerPickerController *)picker // 弹窗
                  didConnectPeer:(NSString *)peerID // 连接到的蓝牙设备号
                       toSession:(GKSession *)session // 连接会话(通过它进行数据交互)
    {
        NSLog(@"%s, line = %d", __FUNCTION__, __LINE__);
        // 弹窗消失
        [picker dismiss];
        // 保存会话
        self.session = session;
        // 处理接收到的数据[蓝牙设备接收到数据时,就会调用 [self receiveData:fromPeer:inSession:context:]]
        // 设置数据接受者为:self
        [self.session setDataReceiveHandler:self
                           withContext:nil];
    }
    #pragma mark - 蓝牙设备接收到数据时,就会调用
    - (void)receiveData:(NSData *)data // 数据
               fromPeer:(NSString *)peer // 来自哪个设备
              inSession:(GKSession *)session // 连接会话
                context:(void *)context
    {
        NSLog(@"%s, line = %d", __FUNCTION__, __LINE__);
        // 显示
        self.imageView.image = [UIImage imageWithData:data];
        // 写入相册
        UIImageWriteToSavedPhotosAlbum(self.imageView.image, nil, nil, nil);
    }
    
    
    

    三、注意

    • 只能用于iOS设备之间的链接
    • 只能用于同一个应用程序之间的连接
    • 最好别利用蓝牙发送比较大的数据
  • 相关阅读:
    最近项目中遇到的一个算法挑战
    编程艺术之美,代码也玩穿越
    算法设计之部门消息通知机制
    解决系统迁移到windows 2003 64位服务器后引发的几个小问题
    我的IT成长历程
    a标签各种状态下的样式
    页面底部按钮被顶起问题
    ios点击input输入框,键盘弹出,此时滑动页面,光标位移
    解决移动端弹窗滚动事件触发主页面滚动事件
    浏览器记住密码之后,input背景变黄
  • 原文地址:https://www.cnblogs.com/ShaoYinling/p/5049760.html
Copyright © 2011-2022 走看看