iOS开发——为什么我的scanForPeripheralsWithServices根本不起作用
来源:互联网 发布:电商运营数据分析维度 编辑:程序博客网 时间:2024/06/05 00:34
这次真的是被苹果坑了,最近不是在开发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
啦,放在centralManagerDidUpdateState
的case 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下面。
- iOS开发——为什么我的scanForPeripheralsWithServices根本不起作用
- 为什么我的adapter.notifyDataSetChanged()不起作用?
- 数据结构和算法是程序的根本——为什么?!
- 为什么我的js function中的代码不起作用了?
- iOS开发- stringByReplacingOccurrencesOfString不起作用的坑
- iOS开发根本布景介绍
- [知其然不知其所以然-5] 为什么我的风扇温度很低却转不停/或者温度很高却根本不转?
- 我对“XX神器”的理解——根本算不上病毒
- 为什么你的替代不起作用?
- 复用 - 开发的根本原则
- quartz开发job类@Autowired为什么不起作用?
- 我的ios开发
- jstl的taglib不起作用——c标签不起作用
- iOS开发——我的知识点记录
- 请教自定义的组策略为什么不起作用!
- 为什么Mysql的外键不起作用了?
- 为什么IIS7/7.5的Gzip不起作用
- 为什么你的自定义View wrap_content不起作用?
- linux mmap出现Address 0x7ffff7ff6000 out of bounds>
- 进程kswapd0与events/0消耗大量CPU的问题
- pragma comment的使用(转)
- Java多线程的使用
- DevExtreme常用示例:如何在Visual Studio中创建本地封装包
- iOS开发——为什么我的scanForPeripheralsWithServices根本不起作用
- linux之cut用法
- [java] parse() valueOf() toString的区别
- 关于数据库字段长度字节(byte)和(bit)的几个概念问题!
- CnPack实用功能推荐
- Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载
- jquery 中post 、get的同步问题
- 【Android归纳】回调机制在Android中的应用与实战
- merge-sorted-array