iOS开发——为什么我的scanForPeripheralsWithServices根本不起作用

原创 2015年07月09日 10:30:11

这次真的是被苹果坑了,最近不是在开发iOS蓝牙应用嘛,一开始就TM卡壳了,真是@#$&%*)。我之前翻译的文章中说,第一步是要发现广播的蓝牙外围设备,但就是这简简单单的第一步,走得并没那么顺利。

问题描述

那么问题是什么呢?scanForPeripheralsWithServices是调用了,周围辣么多的蓝牙外围,就是发现不了啊!本该回调的callback函数didDiscoverPeripheral:advertisementData:RSSI:根本就没反应啊!源代码是这样的:

@interface ViewController () <CBCentralManagerDelegate, CBPeripheralDelegate>

@property (strong, nonatomic) CBCentralManager* manager;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

     self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
     [self startScan];
}


/*
 Request CBCentralManager to scan for all available services
 */
- (void) startScan
{
    NSLog(@"Start scanning");

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber  numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil];

    [self.manager scanForPeripheralsWithServices:nil options:options];
}

/*
 Invoked when the central discovers bt peripheral while scanning.
 */
- (void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)aPeripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{

    NSLog(@"THIS NEVER GETS CALLED");

}

/* centralManagerDidUpdateState: is a required method of CBCentralManagerDelegate */
- (void) centralManagerDidUpdateState:(CBCentralManager*)central
{
    switch(central.state) {
        case CBCentralManagerStatePoweredOn:
            NSLog(@"The central manager is powered on and ready.");
            break;
        default:
            break;
    }
}

@end

一点反应没有,坑爹!说好的彼此相爱呢?

解决方案

Google了下,果然有不少我这样的冤大头。大家一致谴责了苹果不负责任乱改代码却不加说明的态度,进而拿出了解决方案:

貌似这一版CoreBluetooth必须在确定centralManager的state为PoweredOn后,才能执行scan操作。于是乎,不要在viewDidLoad里执行startScan啦,放在centralManagerDidUpdateStatecase CBCentralManagerStatePoweredOn 后面就可以了,像这样:

- (void)viewDidLoad {
     [super viewDidLoad];
     self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
     // [self startScan]; //删除这一行
     }
- (void) centralManagerDidUpdateState:(CBCentralManager*)central
{
    switch(central.state) {
        case CBCentralManagerStatePoweredOn:
            NSLog(@"The central manager is powered on and ready.");
            [self startScan]; //加到这里这里这里!
            break;
        default:
            break;
    }
}

嗯,运行下,是不是终于didDiscoverPeripheral了?感激涕零。。。个屁啊!坑爹不是这么坑的,气死我了,苹果官方给的sample里也没提到这事儿啊,还是在viewDidLoad里面扫描得很带劲啊,根本没提这茬。

总结

呼——平心静气地总结一下,iOS 8里面(其他没试过),如果你要scanForPeripheralsWithServices的话,必须要放在centralManagerDidUpdateState的CBCentralManagerStatePoweredOn下面。

版权声明:本文为博主原创文章,未经博主允许不得转载。

蓝牙开发初步认识

要了解一项技术,最好先了解一下历史。1994年,爱立信一位工程师,为了解除日益增多的连接线缆的烦恼,发明了一种名为蓝牙的短距离无线通信技术。自2001年发布蓝牙1.1版本技术规范,一群诺基亚的工程师就...
  • u011342466
  • u011342466
  • 2016年05月11日 14:03
  • 2732

CBCentralManager学习笔记

自己看着文档写的,权当笔记。 // CBCentralManager学习笔记 @interface CBCentralManager : NSObject //C...
  • Dwarven
  • Dwarven
  • 2014年07月16日 10:59
  • 22615

CBCentralManager、CBPeripheral等简要理解DEMO

首先要在Info.plist中添加一个项目 key为Required background modes 类型为array 添加两个值App shares data using CoreBluet...
  • anan890624
  • anan890624
  • 2016年11月30日 16:25
  • 715

CoreBluetooth

硬體週邊Tips Contents  [hide]  1 藍牙 1.1 BLE(CoreBluetooth) 1.1.1 Disc...
  • chenli522
  • chenli522
  • 2013年12月04日 10:52
  • 15257

IOS蓝牙4.0与读卡器通讯

蓝牙协议本身经历了从1.0到4.0的升级演变, 最新的4.0以其低功耗著称,所以一般也叫BLE(Bluetoothlow energy)。 iOS 有两个框架支持蓝牙与外设连接。一个是 Externa...
  • pony_maggie
  • pony_maggie
  • 2014年05月23日 20:33
  • 114982

BLE4.0 实现蓝牙打印机

一 IOS 蓝牙介绍 蓝牙协议本身经历了从1.0到4.0的升级演变, 最新的4.0以其低功耗著称,所以一般也叫BLE(Bluetoothlow energy)。 iOS 有两个框架支持蓝牙与外设连...
  • win_mary
  • win_mary
  • 2015年11月25日 14:54
  • 2567

我为什么不开心?

今天忽然发现我有很多事情还没处理:1,关于解决上海这边问题的鞠总电话还没打,在想在如何打比较合适?2,莆田学院参训的学生的邮件还没整理好转给老板!3,上海培训的课程效果如何还没体现!一直很郁闷,不爽中...
  • zubin006
  • zubin006
  • 2007年12月20日 14:13
  • 417

CoreBluetooth 完整实现

头文件 // //  BlueToothTool.h //  RuiHan //  蓝牙操作相关工具类 //  Created by apple on 2017/2/...
  • weixin_37684514
  • weixin_37684514
  • 2017年02月27日 17:07
  • 172

iOS 蓝牙低功耗使用

蓝牙技术,很早以前就被有了,如今已更新4.0版本。很多热门技术都是基于它工作的,如Android平台的NFC,iOS的iBeancon等,现在的智能家居基本也是基于蓝牙4.0与APP进行通信。在iOS...
  • u012701023
  • u012701023
  • 2017年07月31日 14:48
  • 487

蓝牙中心开发

#import "ViewController.h" #import #define kServiceUUID @"32666A22-BF04-4A0F-B469-81CFA...
  • Elonwang
  • Elonwang
  • 2016年05月21日 19:34
  • 73
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS开发——为什么我的scanForPeripheralsWithServices根本不起作用
举报原因:
原因补充:

(最多只允许输入30个字)