浅谈iOS中的蓝牙技术(一) --GameKit.framework

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

First

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

Second

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

  • 搭建UI

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

UI

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

  • UI的功能

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

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

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

Code

点击UIImageView选择图片

在tap手势的点击事件中:

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

接收数据

GKPeerPickerControllerDelegate方法

我们可以看到上图是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:self
                            withContext: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 https://github.com/coderqiao/GameKit-- ,在两台真机之间传输测试.

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容