浅谈iOS中的蓝牙技术(一) GameKit framework
蓝牙低能耗(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相关推荐
- 浅谈iOS中关于app的优化
目录 我要给出的建议将分为三个不同的等级: 入门级. 中级和进阶级: 入门级(这是些你一定会经常用在你app开发中的建议) 1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier ...
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...
- 浅谈云计算和大数据技术
浅谈云计算和大数据技术 背景: 随着计算机技术的发展,数据量日益增长,现有技术也很难满足业务的发展需求,在代码的层层迭代和优化之后,还是很难满足数据的增长需求,迫切需要一项新的技术来从事数据计算,因为 ...
- 浅谈iOS和Android后台实时消息推送的原理和区别
http://www.52im.net/thread-286-1-1.html 前言 iOS和Android上的实时消息推送差异很大,往小了说是技术实现的差异,往大了说是系统实现理念的不同.实时消息推 ...
- 浅谈GCC预编译头技术
浅谈GCC预编译头技术 文/jorge --谨以此文,悼念我等待MinGW编译时逝去的那些时间. 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA.后来 ...
- iOS实录15:浅谈iOS Crash
导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象.野指针.内存泄漏.废弃内存这 ...
- linux中sh+$0,浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释
摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: ...
- 浅谈网络通信中的流量整形
前言 在前面的<浅谈网络通信中的 ACK.NACK 和 REX>一文中,我们知道了网络通信中的丢包重传的相关理论和方法,既在网络发生丢包的情况下的补救措施,本文则往前进一步,介绍下如何通过 ...
- python中gil锁和线程锁_浅谈Python中的全局锁(GIL)问题
CPU-bound(计算密集型) 和I/O bound(I/O密集型) 计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态.比如复杂的 ...
最新文章
- 计算机虚拟网络毕业论文,计算机毕业论文——基于WEB的虚拟计算机网络实验平台.doc...
- 点到线段的距离计算方法
- js中event对象属性和方法
- 7 个建议让 Code Review 高效又高质
- kafka消费端慢慢延迟(网络带宽不足)
- 睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)
- angularJs的继承
- Leetcode 1013. 总持续时间可被 60 整除的歌曲
- 微信公众平台开发(五) 天气预报功能开发
- 用ps绘制中国银行的标志
- forrtl: error (200): program aborting due to control-C event
- validation参数检验 - 如何使用
- python 审批流系统
- gazebo publish pose
- 2017艾普兰机智云全家福
- JS防抖(Debouncing)和节流(Throttling)
- 安装sql 2008 express 企业管理器Management Studio
- 阿里云SVN服务器迁移
- 嵌入式系统(Embedded System)概述及其应用
- EOS的侧链技术亮点是什么?