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

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

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

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

推荐阅读更多精彩内容