前言:由于公司最近提出要接入藍(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