iOS蓝牙调用-仿iPhone设置页面蓝牙列表效果

2018-05-17  本文已影响0人  IThai
前言:由于公司最近提出要接入蓝牙打印功能需求,提前来试了下,好多坑。不过,到了打印机这个地方,俺是左等右等啊,就是等不来个打印机。现在,领导又说打印机太贵了,客户不想给配。我的打印机啊,这不坑嘛。我还要试打印功能呢,这大好的机会就没了。
讲故事的时间到了!
从前有一家公司吧,就是没让我试打印机功能,后来倒闭了呢,当初是那样的强大啊!哎,秦人不暇自哀,而后人哀之。后人哀之而不鉴之,亦使后人而复哀后人矣!一个打印机都不舍得买,不让俺试打印机,愿贵公司繁荣昌盛,千秋万代。阿弥陀佛。
对不起,我错了,请放下您手中的块状物。减了需求,我开心还来不及呢。不信,您看我这红肿的面庞。

plist配置如图:


Pasted Graphic.png
声明:本文借鉴多篇网络资源,记不全了。这里提供两个🔗:🔗一

[另一个链接,因为看到多篇相似文章,不确定原作者是谁,就不给了。]

iOS模拟iPhone设置中蓝牙页面,实现蓝牙外设获取并连接,列表页面效果。

首先:
有两个代理需要了解:

CBCentralManagerDelegate(中心设备管理代理)
CBPeripheralDelegate(外设代理)

使用步骤:
一.导入蓝牙所需框架

#import <CoreBluetooth/CoreBluetooth.h>

二.使用
1.大致步骤如下:

  /*第一步:创建设备管理器
 创建完之后,会回调CBCentralManagerDelegate中的方法:- (void)centralManagerDidUpdateState:(CBCentralManager *)central
 */
-(void)initCBCentralManager
{
    self.centerManager = [[CBCentralManager alloc] init];
    self.centerManager = [self.centerManager initWithDelegate:self queue:nil];
    self.peripherals = [NSMutableArray array]; //存放所有扫描到的蓝牙外设
    NSLog(@"self.centerManager ===== %@",self.centerManager);
}

对于蓝牙监听状态方法,单独给出下。这里头有料。

//外设管理器状态发生变化,初始化centerManger后,会走这里
-(void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    /*
     温馨提示:
     由于ios11 🍎开发人员给iPhone一个新功能,在上拉的控制中心里,我们可以快捷关闭wifi和蓝牙了。but,只是关闭当前连接着的蓝牙、wifi,也就是说,如果当前网络环境下还有可以连接到的wifi和蓝牙,你在控制中心关闭掉当前连接的之后,会重新寻找可连接网络去连接。如果想要完全关闭,需要进入到设置页面去关闭。
     嗨,苹果,你个地主家的傻儿子,租子收多了没事干吗?可恶。
     那么开发人员有什么问题呢?
     有!我发现,在设置中心打开蓝牙后,如果再去上拉的控制中心关闭掉蓝牙,就有问题了。这个代理中监听到的状态一直是4(可用,但是未打开。)如果你重新去设置中心关闭,再打开。状态变为正常,但是,保证手机蓝牙状态不变,再次打开app,这个代理监听到的状态还是4。未找到解决方法。
     希望有人可以给个帮助。
     */
    NSLog(@"central.state ===== %ld",(long)central.state);
    [_bluetoothSwitch setOn:NO];
    switch (central.state) {
        case CBCentralManagerStateResetting:
            NSLog(@"CBCentralManagerStateResetting");
            break;
        case CBCentralManagerStateUnknown:
            NSLog(@"CBCentralManagerStateUnknown");
            break;
        case CBCentralManagerStatePoweredOn:
        {
            NSLog(@"打开,可用");
            [_bluetoothSwitch setOn:YES];
            //给个scan Button,在button方法中扫描
            
            [self.centerManager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@(NO)}];
            //                        //key值是NSNumber,默认值为NO表示不会重复扫描已经发现的设备,如需要不断获取最新的信号强度RSSI所以一般设为YES了
        }
            break;
        case CBCentralManagerStatePoweredOff:
        {
            NSLog(@"可用,未打开");
            [ToolBox noticeContent:@"蓝牙未打开,请在设置中打开" andShowView:self.view andyOffset:NoticeHeight];
        }
            break;
        case CBCentralManagerStateUnsupported:
        {
            NSLog(@"设备不支持");
            [ToolBox noticeContent:@"设备不支持" andShowView:self.view andyOffset:NoticeHeight];
        }
            break;
        case CBCentralManagerStateUnauthorized:
        {
            NSLog(@"程序未授权");
            [ToolBox noticeContent:@"程序未授权,请在设置中打开蓝牙权限" andShowView:self.view andyOffset:NoticeHeight];
        }
            break;
    }
}
//第二步:扫描蓝牙外设
- (void)scan:(id)sender
{
    if (self.centerManager.state != CBCentralManagerStatePoweredOn)
    {
        [ToolBox noticeContent:@"请检查蓝牙是否打开" andShowView:self.view andyOffset:NoticeHeight];
        if ([_tableView.mj_header isRefreshing])
            [_tableView.mj_header endRefreshing];
        return;
    }
    //扫描蓝牙设备
    [self.centerManager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@(NO)}];
    //key值是NSNumber,默认值为NO表示不会重复扫描已经发现的设备,如需要不断获取最新的信号强度RSSI所以一般设为YES了
}

下边只给出所需代理的方法名称,内部实现,可以在demo中
查看

#pragma mark  =====  CBCentralManagerDelegate  =====
/*第三步:扫描完成,将发现设备的不重复地添加到外设数组中
 这个代理方法每扫描到一个外设,就会进入一次。
 */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI//RSSI信号强度;
//第四步:连接蓝牙设备
- (void)connectPeripheral:(CBPeripheral *)peripheral;
/*第五步:连接成功后,调用扫描蓝牙外设服务的代理
 [peripheral discoverServices:nil];
 */
-(void) centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;//连接失败代理
-(void) centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;//收到连接状态断开 代理
#pragma mark  ======   CBPeripheralDelegate  =====
/*第六步:扫描到外设服务后,可以获取外设的服务特性
 [peripheral discoverCharacteristics:nil forService:service];
 */
 -(void) peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;
 //第七步:扫描到指定外设的服务特性,根据外设特性进行交互
 -(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
 //如果需要打印,可以实现下面方法
-(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

demo

上一篇下一篇

猜你喜欢

热点阅读