BLE蓝牙ios(二)

今天我们来学习GameKit用法

  • 逻辑
    1.创建附近设备搜索框
    2.设置提示框代理
    3.调用方法展示提示框
    4.实现代理方法
    5.在代理方法中对传输数据进行处理

  • 代码演示

1.在ViewController.m中导入
#import <GameKit/GameKit.h>

2.创建ui 搜索设备的btn、发送数据的btn、展示数据的imageView
<pre>
@property (nonatomic, strong) UIButton *clinkBtn;//建立连接
@property (nonatomic, strong) UIButton sendBtn;//发送数据
@property (nonatomic, strong) UIImageView imageView;//显示数据
@property (nonatomic, strong) GKSession session;/
会话
/
// 注意UI懒加载代码神略了哦
-(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self setUpSubViews];
}
-(void)setUpSubViews{
[self.view addSubview:self.clinkBtn];
[self.view addSubview:self.sendBtn];
[self.view addSubview:self.imageView];
}
</pre>

3.在clinkBtn的点击方法调用时创建附近设备的搜索提示框,并设置代理,并遵守协议<GKPeerPickerControllerDelegate>

-(void)clinkBtnAction{
    //创建一个附近设备的搜索提示框
    GKPeerPickerController *ppc = [[GKPeerPickerController alloc]init];//适配6.0,把版本号改成6.0,就不会再报警告
    //    如果要搜索到设备,还要用到代理方法
    ppc.delegate = self;
    
    [ppc show];
}

此时,我们运行代码


屏幕快照 2016-11-27 下午3.19.14.png

点击按钮 建立连接


屏幕快照 2016-11-27 下午3.19.34.png
出现搜索设备的弹框,因为GameKit的局限性:

就是搜索设备功能只能搜索到 打开蓝牙 运行同一个app并点击 建立连接按钮的设备,所以此时我们运行在模拟器上的demo会一直处于搜索设备的状态

那么,我们把项目运行到真机上:让真机和模拟器进行数据传递。左边是真机,右边是模拟器。


屏幕快照 2016-11-27 下午9.11.00.png
  • 此时,两边都点击建立连接


    屏幕快照 2016-11-27 下午9.12.57.png
屏幕快照 2016-11-27 下午9.13.19.png

这时候我们就可就可以点击模拟器上搜索到的iPhone,或者点击真机上搜索到的MacBookAir,进行数据传递了。

4.设置传递的数据,这里我们设置一张图片到imageView上,首先给imageView添加手势,点击imageView打开相册,选择相册一张图片后把此图设置到imageView上显示。

  • 添加手势
 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapaction)];
        [_imageView addGestureRecognizer:tap];
  • 实现手势调用方法,并签署相册协议<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
-(void)tapaction{
    // 判断是否支持相册选择
    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
        NSLog(@"木有相册");
        return;
    }
//创建选择相片的控制器
    UIImagePickerController *pic = [[UIImagePickerController alloc]init];
    pic.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    pic.delegate = self;
    [self presentViewController:pic animated:YES completion:nil];
}
  • 实现相册代理方法
    <pre>
    // 图片选择完之后调用的方法
    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{

    [picker dismissViewControllerAnimated:YES completion:nil];
    NSLog(@"%s,line = %d,info = %@",func,LINE,info);
    //把图片设置到imageView上显示
    self.imageView.image = info[UIImagePickerControllerOriginalImage];

}
</pre>
5.实现点击 发送按钮方法 sendBtn;//发送数据

-(void)sendBtnAction{
    //第一步判断要发送的数据是否存在
    if (!self.imageView.image) return;
    // 发送数据
//    [self.session sendData:UIImagePNGRepresentation(self.imageView.image) toPeers:<#(NSArray *)#>//已经连接的所有设备
//              withDataMode:<#(GKSendDataMode)#> error:<#(NSError *__autoreleasing *)#>]
    NSError *error = nil;
  BOOL sendState = [self.session sendDataToAllPeers:UIImagePNGRepresentation(self.imageView.image)
                        withDataMode:GKSendDataReliable//GKSendDataReliable可靠地传输方式,慢,不会丢包,直到传完,传递的信息完整;GKSendDataUnreliable快,丢包,可能传不完,信息可能不完整
                               error:&error];
    if (!sendState) {
        NSLog(@"%@",error.localizedDescription);
    }
}

6.处理数据传递,实现代理方法

#pragma mark - GKPeerPickerControllerDelegate
//最长用的方法,已经成功连接到某个设备,并且开启了连接会话
- (void)peerPickerController:(GKPeerPickerController *)picker //搜索框
              didConnectPeer:(NSString *)peerID //设备id,连接的设备
    toSession:(GKSession *)session  //连接会话,通过会话可以通过数据传输
{

    NSLog(@"%s,line = %d",__func__,__LINE__);
//   1. 首先让搜索弹框消失
    [picker dismiss];
    
// 2. 记录会话信息
    self.session = session;
// 3.传输数据
    
    //4.设置接收数据,设置完接受者之后,接收数据会触发方法receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context 现在苹果已经把这个方法干掉,就是告诉用户不要用这个框架了;现在我们只是了解学习
    [self.session setDataReceiveHandler:self withContext:nil];  
}
// 设置接收数据,设置完接受者之后,接收数据会触发此方法,现在苹果已经把此方法干掉,就是告诉用户不要用这个框架了;现在我们只是了解学习
- (void)receiveData:(NSData *)data//数据
           fromPeer:(NSString *)peer//来自哪个设备
          inSession:(GKSession *)session//连接会话
            context:(void *)context//
{
    NSLog(@"%s,line = %d,data = %@,peer = %@,session = %@",__func__,__LINE__,data,peer,session);
    // 将接收的数据展示在屏幕上
    self.imageView.image = [UIImage imageWithData:data];
    

}

ok ,可以真机与模拟器之间相互传递数据了

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

推荐阅读更多精彩内容