iOS藍(lán)牙調(diào)用-仿iPhone設(shè)置頁面藍(lán)牙列表效果

前言:由于公司最近提出要接入藍(lán)牙打印功能需求,提前來試了下,好多坑。不過,到了打印機(jī)這個地方,俺是左等右等啊,就是等不來個打印機(jī)。現(xiàn)在,領(lǐng)導(dǎo)又說打印機(jī)太貴了,客戶不想給配。我的打印機(jī)啊,這不坑嘛。我還要試打印功能呢,這大好的機(jī)會就沒了。
講故事的時間到了!
從前有一家公司吧,就是沒讓我試打印機(jī)功能,后來倒閉了呢,當(dāng)初是那樣的強(qiáng)大啊!哎,秦人不暇自哀,而后人哀之。后人哀之而不鑒之,亦使后人而復(fù)哀后人矣!一個打印機(jī)都不舍得買,不讓俺試打印機(jī),愿貴公司繁榮昌盛,千秋萬代。阿彌陀佛。
對不起,我錯了,請放下您手中的塊狀物。減了需求,我開心還來不及呢。不信,您看我這紅腫的面龐。

plist配置如圖:


Pasted Graphic.png
聲明:本文借鑒多篇網(wǎng)絡(luò)資源,記不全了。這里提供兩個??:??一

[另一個鏈接,因?yàn)榭吹蕉嗥嗨莆恼拢淮_定原作者是誰,就不給了。]

iOS模擬iPhone設(shè)置中藍(lán)牙頁面,實(shí)現(xiàn)藍(lán)牙外設(shè)獲取并連接,列表頁面效果。

首先:
有兩個代理需要了解:

CBCentralManagerDelegate(中心設(shè)備管理代理)
CBPeripheralDelegate(外設(shè)代理)

使用步驟:
一.導(dǎo)入藍(lán)牙所需框架

#import <CoreBluetooth/CoreBluetooth.h>

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

  /*第一步:創(chuàng)建設(shè)備管理器
 創(chuàng)建完之后,會回調(diào)CBCentralManagerDelegate中的方法:- (void)centralManagerDidUpdateState:(CBCentralManager *)central
 */
-(void)initCBCentralManager
{
    self.centerManager = [[CBCentralManager alloc] init];
    self.centerManager = [self.centerManager initWithDelegate:self queue:nil];
    self.peripherals = [NSMutableArray array]; //存放所有掃描到的藍(lán)牙外設(shè)
    NSLog(@"self.centerManager ===== %@",self.centerManager);
}

對于藍(lán)牙監(jiān)聽狀態(tài)方法,單獨(dú)給出下。這里頭有料。

//外設(shè)管理器狀態(tài)發(fā)生變化,初始化centerManger后,會走這里
-(void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    /*
     溫馨提示:
     由于ios11 ??開發(fā)人員給iPhone一個新功能,在上拉的控制中心里,我們可以快捷關(guān)閉wifi和藍(lán)牙了。but,只是關(guān)閉當(dāng)前連接著的藍(lán)牙、wifi,也就是說,如果當(dāng)前網(wǎng)絡(luò)環(huán)境下還有可以連接到的wifi和藍(lán)牙,你在控制中心關(guān)閉掉當(dāng)前連接的之后,會重新尋找可連接網(wǎng)絡(luò)去連接。如果想要完全關(guān)閉,需要進(jìn)入到設(shè)置頁面去關(guān)閉。
     嗨,蘋果,你個地主家的傻兒子,租子收多了沒事干嗎?可惡。
     那么開發(fā)人員有什么問題呢?
     有!我發(fā)現(xiàn),在設(shè)置中心打開藍(lán)牙后,如果再去上拉的控制中心關(guān)閉掉藍(lán)牙,就有問題了。這個代理中監(jiān)聽到的狀態(tài)一直是4(可用,但是未打開。)如果你重新去設(shè)置中心關(guān)閉,再打開。狀態(tài)變?yōu)檎#牵WC手機(jī)藍(lán)牙狀態(tài)不變,再次打開app,這個代理監(jiān)聽到的狀態(tài)還是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,默認(rèn)值為NO表示不會重復(fù)掃描已經(jīng)發(fā)現(xiàn)的設(shè)備,如需要不斷獲取最新的信號強(qiáng)度RSSI所以一般設(shè)為YES了
        }
            break;
        case CBCentralManagerStatePoweredOff:
        {
            NSLog(@"可用,未打開");
            [ToolBox noticeContent:@"藍(lán)牙未打開,請在設(shè)置中打開" andShowView:self.view andyOffset:NoticeHeight];
        }
            break;
        case CBCentralManagerStateUnsupported:
        {
            NSLog(@"設(shè)備不支持");
            [ToolBox noticeContent:@"設(shè)備不支持" andShowView:self.view andyOffset:NoticeHeight];
        }
            break;
        case CBCentralManagerStateUnauthorized:
        {
            NSLog(@"程序未授權(quán)");
            [ToolBox noticeContent:@"程序未授權(quán),請在設(shè)置中打開藍(lán)牙權(quán)限" andShowView:self.view andyOffset:NoticeHeight];
        }
            break;
    }
}
//第二步:掃描藍(lán)牙外設(shè)
- (void)scan:(id)sender
{
    if (self.centerManager.state != CBCentralManagerStatePoweredOn)
    {
        [ToolBox noticeContent:@"請檢查藍(lán)牙是否打開" andShowView:self.view andyOffset:NoticeHeight];
        if ([_tableView.mj_header isRefreshing])
            [_tableView.mj_header endRefreshing];
        return;
    }
    //掃描藍(lán)牙設(shè)備
    [self.centerManager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@(NO)}];
    //key值是NSNumber,默認(rèn)值為NO表示不會重復(fù)掃描已經(jīng)發(fā)現(xiàn)的設(shè)備,如需要不斷獲取最新的信號強(qiáng)度RSSI所以一般設(shè)為YES了
}

下邊只給出所需代理的方法名稱,內(nèi)部實(shí)現(xiàn),可以在demo中
查看

#pragma mark  =====  CBCentralManagerDelegate  =====
/*第三步:掃描完成,將發(fā)現(xiàn)設(shè)備的不重復(fù)地添加到外設(shè)數(shù)組中
 這個代理方法每掃描到一個外設(shè),就會進(jìn)入一次。
 */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI//RSSI信號強(qiáng)度;
//第四步:連接藍(lán)牙設(shè)備
- (void)connectPeripheral:(CBPeripheral *)peripheral;
/*第五步:連接成功后,調(diào)用掃描藍(lán)牙外設(shè)服務(wù)的代理
 [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;//收到連接狀態(tài)斷開 代理
#pragma mark  ======   CBPeripheralDelegate  =====
/*第六步:掃描到外設(shè)服務(wù)后,可以獲取外設(shè)的服務(wù)特性
 [peripheral discoverCharacteristics:nil forService:service];
 */
 -(void) peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;
 //第七步:掃描到指定外設(shè)的服務(wù)特性,根據(jù)外設(shè)特性進(jìn)行交互
 -(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
 //如果需要打印,可以實(shí)現(xiàn)下面方法
-(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內(nèi)容