蓝牙低能耗(BLE)技术是低成本、短距离、可互操作的无线技术,工作在免许可的2.4GHz ISM射频频段.

Start

  • GameKit.framework 只能用于iOS设备之间同个应用内连接,多用于游戏中,但是从iOS7之后就过期了,最好别利用蓝牙发送比较大的数据.

Second

我们通过GameKit框架来演示建立连接传输数据(从手机的相册中传输一张照片)的过程.

  • 搭建UI

我们不再演示搭建UI的过程,总之界面如下:

使用,storyboard搭建UI,其中建立连接和发送数据是两个button,并且脱出响应事件,绿色的部分是UIImageView,并且设置其UserInteractionEnable为YES,并且添加Tap手势,拖出Tap的响应事件.

  • UI的功能

Tap手势点击UIImageView进入相册选择照片并且显示在UIImageView上,

建立连接按钮 开始查找周围的设备,并且建立连接

发送数据按钮 将图片发送至连接到的设备上

Code

点击UIImageView选择图片

在tap手势的点击事件中:

- (IBAction)tap:(UITapGestureRecognizer *)sender {// 判断是否存在相册,不存在直接returnif (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {return;}// 创建控制器UIImagePickerController *ipc = [[UIImagePickerController alloc]init];// 设置图片来源为相册ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;// 设置代理ipc.delegate = self;// 模态出控制器[self presentViewController:ipc animated:YES completion:nil];
}// UIImagePickerController代理方法
// 选择完照片之后调用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{[picker dismissViewControllerAnimated:YES completion:nil];
// 将选择的图片显示在UIImageView上self.iamgeView.image = info[UIImagePickerControllerOriginalImage];}
复制代码

建立连接

// 建立连接
- (IBAction)connection:(UIButton *)sender {GKPeerPickerController *ppc = [[GKPeerPickerController alloc] init];// 设置代理监听连接成功的方法ppc.delegate = self;[ppc show];
}
复制代码

当我们点击 建立连接按钮的时候弹出GKPeerPickerController控制器,来查找周围的设备.我们从字面上理解peer就是 窥视,盯着看 的意思,就是说,在检测周围可连接的设备.并且我们为该控制器设置代理方法,注意遵循 GKPeerPickerControllerDelegate协议,用来监听连接是否成功,以便进行接下来的操作.

发送数据

// 发送数据
- (IBAction)send:(UIButton *)sender {
// 如果UIImageView上没有图片,那么不发送直接returnif (self.iamgeView.image == nil) {return;}/*** 回话调用传输数据的方法向所有连接成功的设备发送数据* 在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. 这里选择其一,其中前一个在处理图片的时候是可以进行压缩的*DataMode中有两个元素,GKSendDataReliable和GKSendDataUnreliable,前者是可靠传输,如果出现网络拥塞,会分片和重组这个数据消息,后者不能保证数据的完整性*/[self.session sendDataToAllPeers:UIImagePNGRepresentation(self.iamgeView.image) withDataMode:GKSendDataReliable error:nil];}
复制代码

接收数据

我们可以看到上图是GKPeerPickerControllerDelegate中的方法.

  • 第一个方法的作用是通知代理,由用户选择连接类型
  • 第二个方法的作用是通知代理,连接类型请求GKSession对象 注: 这里返回一个GKSession对象给peer使用。如果这个方法不执行或返回nil,那么就会创建一个默认GKSession代理的代表。
  • 第三个方法的作用是通知代理,已经完成连接,连接到了一个GKSession
  • 第四个方法的作用是通知委托用户取消了picker.

在这里我们主要用到的是第三个方法,已经成功建立了连接.连接建立完成之后我们将GKPeerPickerController给取消掉调用dismiss方法.然后由于我们要传输这个数据,所以我们需要保留回话,而会话就是方法参数中的session,保留session,我们创建一个GKSession的属性,然后将参数中的session赋值给属性session就可以保证在连接和传输的整个过程中使用了.

@property (strong, nonatomic)GKSession *session;

- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {// 撤销picker这个控制器[picker dismiss];// 保留会话self.session = session;// 由当前控制器处理数据,蓝牙设备接收到数据时,就会调用 [self receiveData:fromPeer:inSession:context:]]  上下文context设置为nil即可.[self.session setDataReceiveHandler:selfwithContext:nil];}
复制代码

接收到数据之后

// 蓝牙设备接收到数据时,就会调用该方法
/***data表示接收到的数据*peer表示传输数据的设备*session表示这个连接的整个会话*context表示上下文*/
- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context
{// 显示self.iamgeView.image = [UIImage imageWithData:data];// 写入相册UIImageWriteToSavedPhotosAlbum(self.iamgeView.image, nil, nil, nil);// 弹窗提示来自哪个设备UIAlertController *alert = [UIAlertController alertControllerWithTitle:peer message:peer preferredStyle:UIAlertControllerStyleAlert];[self presentViewController:alert animated:YES completion:nil];}复制代码

END

由于蓝牙需要使用真机测试,所以模拟器上的演示只能至此,如果有兴趣,可以下载 Demo github.com/coderqiao/G… ,在两台真机之间传输测试.

本文学习自小码哥大神班的视频,在此感谢......

浅谈iOS中的蓝牙技术(一) GameKit framework相关推荐

  1. 浅谈iOS中关于app的优化

    目录 我要给出的建议将分为三个不同的等级: 入门级. 中级和进阶级: 入门级(这是些你一定会经常用在你app开发中的建议) 1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier ...

  2. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  3. 浅谈云计算和大数据技术

    浅谈云计算和大数据技术 背景: 随着计算机技术的发展,数据量日益增长,现有技术也很难满足业务的发展需求,在代码的层层迭代和优化之后,还是很难满足数据的增长需求,迫切需要一项新的技术来从事数据计算,因为 ...

  4. 浅谈iOS和Android后台实时消息推送的原理和区别

    http://www.52im.net/thread-286-1-1.html 前言 iOS和Android上的实时消息推送差异很大,往小了说是技术实现的差异,往大了说是系统实现理念的不同.实时消息推 ...

  5. 浅谈GCC预编译头技术

    浅谈GCC预编译头技术 文/jorge --谨以此文,悼念我等待MinGW编译时逝去的那些时间. 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA.后来 ...

  6. iOS实录15:浅谈iOS Crash

    导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象.野指针.内存泄漏.废弃内存这 ...

  7. linux中sh+$0,浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释

    摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: ...

  8. 浅谈网络通信中的流量整形

    前言 在前面的<浅谈网络通信中的 ACK.NACK 和 REX>一文中,我们知道了网络通信中的丢包重传的相关理论和方法,既在网络发生丢包的情况下的补救措施,本文则往前进一步,介绍下如何通过 ...

  9. python中gil锁和线程锁_浅谈Python中的全局锁(GIL)问题

    CPU-bound(计算密集型) 和I/O bound(I/O密集型) 计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态.比如复杂的 ...

最新文章

  1. 计算机虚拟网络毕业论文,计算机毕业论文——基于WEB的虚拟计算机网络实验平台.doc...
  2. 点到线段的距离计算方法
  3. js中event对象属性和方法
  4. 7 个建议让 Code Review 高效又高质
  5. kafka消费端慢慢延迟(网络带宽不足)
  6. 睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)
  7. angularJs的继承
  8. Leetcode 1013. 总持续时间可被 60 整除的歌曲
  9. 微信公众平台开发(五) 天气预报功能开发
  10. 用ps绘制中国银行的标志
  11. forrtl: error (200): program aborting due to control-C event
  12. validation参数检验 - 如何使用
  13. python 审批流系统
  14. gazebo publish pose
  15. 2017艾普兰机智云全家福
  16. JS防抖(Debouncing)和节流(Throttling)
  17. 安装sql 2008 express 企业管理器Management Studio
  18. 阿里云SVN服务器迁移
  19. 嵌入式系统(Embedded System)概述及其应用
  20. EOS的侧链技术亮点是什么?

热门文章

  1. 什么是 JS 原型链?
  2. mock方法常用框架_基于MOCK对象和JUNIT框架测试DAO
  3. 浅谈分布式和微服务架构
  4. 'utf8' codec can't decode byte --python
  5. python设计模式18-备忘录模式
  6. 多线程的那点儿事(之数据同步)
  7. security中的@EnableGlobalMethodSecurity注解详解
  8. CPU占用率过高和OOM场景下如何排查问题
  9. Kafka的架构设计
  10. activity任意节点跳转