版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.08.07 |
前言
很多时候我们需要使用蓝牙,在使用的时候我们都需要判断蓝牙当前的使用状态,然后再做相关的逻辑处理,下面我就简单的实现了下,希望对大家有所帮助。
功能目标
获取蓝牙当前的应用状态。
功能实现
1.几个重要的类和框架
<CoreBluetooth/CoreBluetooth.h>框架
CBCentralManager
CBManager
<CoreBluetooth/CoreBluetooth.h>
这里就是和蓝牙相关的框架,所有的实现都在这里完成。
#ifndef _CORE_BLUETOOTH_H_
#define _CORE_BLUETOOTH_H_
#endif
#import <CoreBluetooth/CBCentralManager.h>
#import <CoreBluetooth/CBPeripheralManager.h>
#import <CoreBluetooth/CBPeripheral.h>
#import <CoreBluetooth/CBCentral.h>
#import <CoreBluetooth/CBService.h>
#import <CoreBluetooth/CBCharacteristic.h>
#import <CoreBluetooth/CBDescriptor.h>
#import <CoreBluetooth/CBError.h>
#import <CoreBluetooth/CBUUID.h>
#import <CoreBluetooth/CBAdvertisementData.h>
#import <CoreBluetooth/CBATTRequest.h>
CBCentralManager
给出部分API
。
#ifndef _CORE_BLUETOOTH_H_
#warning Please do not import this header file directly. Use <CoreBluetooth/CoreBluetooth.h> instead.
#endif
#import <CoreBluetooth/CBAdvertisementData.h>
#import <CoreBluetooth/CBCentralManagerConstants.h>
#import <CoreBluetooth/CBDefines.h>
#import <CoreBluetooth/CBManager.h>
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/*!
* @enum CBCentralManagerState
*
* @discussion Represents the current state of a CBCentralManager.
*
* @constant CBCentralManagerStateUnknown State unknown, update imminent.
* @constant CBCentralManagerStateResetting The connection with the system service was momentarily lost, update imminent.
* @constant CBCentralManagerStateUnsupported The platform doesn't support the Bluetooth Low Energy Central/Client role.
* @constant CBCentralManagerStateUnauthorized The application is not authorized to use the Bluetooth Low Energy Central/Client role.
* @constant CBCentralManagerStatePoweredOff Bluetooth is currently powered off.
* @constant CBCentralManagerStatePoweredOn Bluetooth is currently powered on and available to use.
*
*/
typedef NS_ENUM(NSInteger, CBCentralManagerState) {
CBCentralManagerStateUnknown = CBManagerStateUnknown,
CBCentralManagerStateResetting = CBManagerStateResetting,
CBCentralManagerStateUnsupported = CBManagerStateUnsupported,
CBCentralManagerStateUnauthorized = CBManagerStateUnauthorized,
CBCentralManagerStatePoweredOff = CBManagerStatePoweredOff,
CBCentralManagerStatePoweredOn = CBManagerStatePoweredOn,
} NS_DEPRECATED(NA, NA, 5_0, 10_0, "Use CBManagerState instead");
@protocol CBCentralManagerDelegate;
@class CBUUID, CBPeripheral;
/*!
* @class CBCentralManager
*
* @discussion Entry point to the central role. Commands should only be issued when its state is <code>CBCentralManagerStatePoweredOn</code>.
*
*/
NS_CLASS_AVAILABLE(10_7, 5_0)
CB_EXTERN_CLASS @interface CBCentralManager : CBManager
/*!
* @property delegate
*
* @discussion The delegate object that will receive central events.
*
*/
@property(nonatomic, weak, nullable) id<CBCentralManagerDelegate> delegate;
/*!
* @property isScanning
*
* @discussion Whether or not the central is currently scanning.
*
*/
@property(nonatomic, assign, readonly) BOOL isScanning NS_AVAILABLE(NA, 9_0);
- (instancetype)init;
/*!
* @method initWithDelegate:queue:
*
* @param delegate The delegate that will receive central role events.
* @param queue The dispatch queue on which the events will be dispatched.
*
* @discussion The initialization call. The events of the central role will be dispatched on the provided queue.
* If <i>nil</i>, the main queue will be used.
*
*/
- (instancetype)initWithDelegate:(nullable id<CBCentralManagerDelegate>)delegate
queue:(nullable dispatch_queue_t)queue;
/*!
* @method initWithDelegate:queue:options:
*
* @param delegate The delegate that will receive central role events.
* @param queue The dispatch queue on which the events will be dispatched.
* @param options An optional dictionary specifying options for the manager.
*
* @discussion The initialization call. The events of the central role will be dispatched on the provided queue.
* If <i>nil</i>, the main queue will be used.
*
* @seealso CBCentralManagerOptionShowPowerAlertKey
* @seealso CBCentralManagerOptionRestoreIdentifierKey
*
*/
- (instancetype)initWithDelegate:(nullable id<CBCentralManagerDelegate>)delegate
queue:(nullable dispatch_queue_t)queue
options:(nullable NSDictionary<NSString *, id> *)options NS_AVAILABLE(NA, 7_0) NS_DESIGNATED_INITIALIZER;
/*!
* @method retrievePeripheralsWithIdentifiers:
*
* @param identifiers A list of <code>NSUUID</code> objects.
*
* @discussion Attempts to retrieve the <code>CBPeripheral</code> object(s) with the corresponding <i>identifiers</i>.
*
* @return A list of <code>CBPeripheral</code> objects.
*
*/
- (NSArray<CBPeripheral *> *)retrievePeripheralsWithIdentifiers:(NSArray<NSUUID *> *)identifiers NS_AVAILABLE(NA, 7_0);
/*!
* @method retrieveConnectedPeripheralsWithServices
*
* @discussion Retrieves all peripherals that are connected to the system and implement any of the services listed in <i>serviceUUIDs</i>.
* Note that this set can include peripherals which were connected by other applications, which will need to be connected locally
* via {@link connectPeripheral:options:} before they can be used.
*
* @return A list of <code>CBPeripheral</code> objects.
*
*/
- (NSArray<CBPeripheral *> *)retrieveConnectedPeripheralsWithServices:(NSArray<CBUUID *> *)serviceUUIDs NS_AVAILABLE(NA, 7_0);
/*!
* @method scanForPeripheralsWithServices:options:
*
* @param serviceUUIDs A list of <code>CBUUID</code> objects representing the service(s) to scan for.
* @param options An optional dictionary specifying options for the scan.
*
* @discussion Starts scanning for peripherals that are advertising any of the services listed in <i>serviceUUIDs</i>. Although strongly discouraged,
* if <i>serviceUUIDs</i> is <i>nil</i> all discovered peripherals will be returned. If the central is already scanning with different
* <i>serviceUUIDs</i> or <i>options</i>, the provided parameters will replace them.
* Applications that have specified the <code>bluetooth-central</code> background mode are allowed to scan while backgrounded, with two
* caveats: the scan must specify one or more service types in <i>serviceUUIDs</i>, and the <code>CBCentralManagerScanOptionAllowDuplicatesKey</code>
* scan option will be ignored.
*
* @see centralManager:didDiscoverPeripheral:advertisementData:RSSI:
* @seealso CBCentralManagerScanOptionAllowDuplicatesKey
* @seealso CBCentralManagerScanOptionSolicitedServiceUUIDsKey
*
*/
- (void)scanForPeripheralsWithServices:(nullable NSArray<CBUUID *> *)serviceUUIDs options:(nullable NSDictionary<NSString *, id> *)options;
/*!
* @method stopScan:
*
* @discussion Stops scanning for peripherals.
*
*/
- (void)stopScan;
/*!
* @method connectPeripheral:options:
*
* @param peripheral The <code>CBPeripheral</code> to be connected.
* @param options An optional dictionary specifying connection behavior options.
*
* @discussion Initiates a connection to <i>peripheral</i>. Connection attempts never time out and, depending on the outcome, will result
* in a call to either {@link centralManager:didConnectPeripheral:} or {@link centralManager:didFailToConnectPeripheral:error:}.
* Pending attempts are cancelled automatically upon deallocation of <i>peripheral</i>, and explicitly via {@link cancelPeripheralConnection}.
*
* @see centralManager:didConnectPeripheral:
* @see centralManager:didFailToConnectPeripheral:error:
* @seealso CBConnectPeripheralOptionNotifyOnConnectionKey
* @seealso CBConnectPeripheralOptionNotifyOnDisconnectionKey
* @seealso CBConnectPeripheralOptionNotifyOnNotificationKey
*
*/
- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;
/*!
* @method cancelPeripheralConnection:
*
* @param peripheral A <code>CBPeripheral</code>.
*
* @discussion Cancels an active or pending connection to <i>peripheral</i>. Note that this is non-blocking, and any <code>CBPeripheral</code>
* commands that are still pending to <i>peripheral</i> may or may not complete.
*
* @see centralManager:didDisconnectPeripheral:error:
*
*/
- (void)cancelPeripheralConnection:(CBPeripheral *)peripheral;
@end
/*!
* @protocol CBCentralManagerDelegate
*
* @discussion The delegate of a {@link CBCentralManager} object must adopt the <code>CBCentralManagerDelegate</code> protocol. The
* single required method indicates the availability of the central manager, while the optional methods allow for the discovery and
* connection of peripherals.
*
*/
@protocol CBCentralManagerDelegate <NSObject>
@required
/*!
* @method centralManagerDidUpdateState:
*
* @param central The central manager whose state has changed.
*
* @discussion Invoked whenever the central manager's state has been updated. Commands should only be issued when the state is
* <code>CBCentralManagerStatePoweredOn</code>. A state below <code>CBCentralManagerStatePoweredOn</code>
* implies that scanning has stopped and any connected peripherals have been disconnected. If the state moves below
* <code>CBCentralManagerStatePoweredOff</code>, all <code>CBPeripheral</code> objects obtained from this central
* manager become invalid and must be retrieved or discovered again.
*
* @see state
*
*/
- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
@optional
/*!
* @method centralManager:willRestoreState:
*
* @param central The central manager providing this information.
* @param dict A dictionary containing information about <i>central</i> that was preserved by the system at the time the app was terminated.
*
* @discussion For apps that opt-in to state preservation and restoration, this is the first method invoked when your app is relaunched into
* the background to complete some Bluetooth-related task. Use this method to synchronize your app's state with the state of the
* Bluetooth system.
*
* @seealso CBCentralManagerRestoredStatePeripheralsKey;
* @seealso CBCentralManagerRestoredStateScanServicesKey;
* @seealso CBCentralManagerRestoredStateScanOptionsKey;
*
*/
- (void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary<NSString *, id> *)dict;
/*!
* @method centralManager:didDiscoverPeripheral:advertisementData:RSSI:
*
* @param central The central manager providing this update.
* @param peripheral A <code>CBPeripheral</code> object.
* @param advertisementData A dictionary containing any advertisement and scan response data.
* @param RSSI The current RSSI of <i>peripheral</i>, in dBm. A value of <code>127</code> is reserved and indicates the RSSI
* was not available.
*
* @discussion This method is invoked while scanning, upon the discovery of <i>peripheral</i> by <i>central</i>. A discovered peripheral must
* be retained in order to use it; otherwise, it is assumed to not be of interest and will be cleaned up by the central manager. For
* a list of <i>advertisementData</i> keys, see {@link CBAdvertisementDataLocalNameKey} and other similar constants.
*
* @seealso CBAdvertisementData.h
*
*/
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI;
/*!
* @method centralManager:didConnectPeripheral:
*
* @param central The central manager providing this information.
* @param peripheral The <code>CBPeripheral</code> that has connected.
*
* @discussion This method is invoked when a connection initiated by {@link connectPeripheral:options:} has succeeded.
*
*/
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
/*!
* @method centralManager:didFailToConnectPeripheral:error:
*
* @param central The central manager providing this information.
* @param peripheral The <code>CBPeripheral</code> that has failed to connect.
* @param error The cause of the failure.
*
* @discussion This method is invoked when a connection initiated by {@link connectPeripheral:options:} has failed to complete. As connection attempts do not
* timeout, the failure of a connection is atypical and usually indicative of a transient issue.
*
*/
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;
/*!
* @method centralManager:didDisconnectPeripheral:error:
*
* @param central The central manager providing this information.
* @param peripheral The <code>CBPeripheral</code> that has disconnected.
* @param error If an error occurred, the cause of the failure.
*
* @discussion This method is invoked upon the disconnection of a peripheral that was connected by {@link connectPeripheral:options:}. If the disconnection
* was not initiated by {@link cancelPeripheralConnection}, the cause will be detailed in the <i>error</i> parameter. Once this method has been
* called, no more methods will be invoked on <i>peripheral</i>'s <code>CBPeripheralDelegate</code>.
*
*/
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;
@end
NS_ASSUME_NONNULL_END
CBManager
#import <CoreBluetooth/CBDefines.h>
#import <Foundation/Foundation.h>
NS_CLASS_AVAILABLE(N_A, 10_0)
CB_EXTERN_CLASS @interface CBManager : NSObject
- (instancetype)init NS_UNAVAILABLE;
/*!
* @enum CBManagerState
*
* @discussion Represents the current state of a CBManager.
*
* @constant CBManagerStateUnknown State unknown, update imminent.
* @constant CBManagerStateResetting The connection with the system service was momentarily lost, update imminent.
* @constant CBManagerStateUnsupported The platform doesn't support the Bluetooth Low Energy Central/Client role.
* @constant CBManagerStateUnauthorized The application is not authorized to use the Bluetooth Low Energy role.
* @constant CBManagerStatePoweredOff Bluetooth is currently powered off.
* @constant CBManagerStatePoweredOn Bluetooth is currently powered on and available to use.
*
*/
typedef NS_ENUM(NSInteger, CBManagerState) {
CBManagerStateUnknown = 0,
CBManagerStateResetting,
CBManagerStateUnsupported,
CBManagerStateUnauthorized,
CBManagerStatePoweredOff,
CBManagerStatePoweredOn,
} NS_ENUM_AVAILABLE(NA, 10_0);
/*!
* @property state
*
* @discussion The current state of the manager, initially set to <code>CBManagerStateUnknown</code>.
* Updates are provided by required delegate method {@link managerDidUpdateState:}.
*
*/
@property(nonatomic, assign, readonly) CBManagerState state;
@end
上面两个类中有两个枚举,定义的就是蓝牙的状态,CBCentralManagerState
已经被废弃了,被CBManagerState
所替代,下面我们就对比看一下。
/*!
* @enum CBCentralManagerState
*
* @discussion Represents the current state of a CBCentralManager.
*
* @constant CBCentralManagerStateUnknown State unknown, update imminent.
* @constant CBCentralManagerStateResetting The connection with the system service was momentarily lost, update imminent.
* @constant CBCentralManagerStateUnsupported The platform doesn't support the Bluetooth Low Energy Central/Client role.
* @constant CBCentralManagerStateUnauthorized The application is not authorized to use the Bluetooth Low Energy Central/Client role.
* @constant CBCentralManagerStatePoweredOff Bluetooth is currently powered off.
* @constant CBCentralManagerStatePoweredOn Bluetooth is currently powered on and available to use.
*
*/
typedef NS_ENUM(NSInteger, CBCentralManagerState) {
CBCentralManagerStateUnknown = CBManagerStateUnknown,
CBCentralManagerStateResetting = CBManagerStateResetting,
CBCentralManagerStateUnsupported = CBManagerStateUnsupported,
CBCentralManagerStateUnauthorized = CBManagerStateUnauthorized,
CBCentralManagerStatePoweredOff = CBManagerStatePoweredOff,
CBCentralManagerStatePoweredOn = CBManagerStatePoweredOn,
} NS_DEPRECATED(NA, NA, 5_0, 10_0, "Use CBManagerState instead");
/*!
* @enum CBManagerState
*
* @discussion Represents the current state of a CBManager.
*
* @constant CBManagerStateUnknown State unknown, update imminent.
* @constant CBManagerStateResetting The connection with the system service was momentarily lost, update imminent.
* @constant CBManagerStateUnsupported The platform doesn't support the Bluetooth Low Energy Central/Client role.
* @constant CBManagerStateUnauthorized The application is not authorized to use the Bluetooth Low Energy role.
* @constant CBManagerStatePoweredOff Bluetooth is currently powered off.
* @constant CBManagerStatePoweredOn Bluetooth is currently powered on and available to use.
*
*/
typedef NS_ENUM(NSInteger, CBManagerState) {
CBManagerStateUnknown = 0,
CBManagerStateResetting,
CBManagerStateUnsupported,
CBManagerStateUnauthorized,
CBManagerStatePoweredOff,
CBManagerStatePoweredOn,
} NS_ENUM_AVAILABLE(NA, 10_0);
2. 代码实现
下面我们就直接看一下代码实现。
#import "JJBluetoothVC.h"
#import <CoreBluetooth/CoreBluetooth.h>
@interface JJBluetoothVC () <CBCentralManagerDelegate>
@property (nonatomic, strong) CBCentralManager *manager;
@end
@implementation JJBluetoothVC
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor lightTextColor];
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}
- (void)dealloc
{
self.manager = nil;
}
#pragma mark - CBCentralManagerDelegate
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
NSString *message = nil;
switch (central.state) {
case 0:
message = @"状态未知,即将更新。";
break;
case 1:
message = @"与系统服务的连接暂时丢失,即将更新";
break;
case 2:
message = @"该平台不支持蓝牙低功耗中央/客户端角色。";
break;
case 3:
message = @"该平台未授权使用蓝牙低功耗中央/客户端角色。";
break;
case 4:
message = @"蓝牙关闭";
break;
case 5:
message = @"蓝牙打开";
break;
default:
break;
}
if (message && message.length > 0) {
NSLog(@"message = %@", message);
}
}
@end
下面看输出结果
2017-08-07 11:46:33.320425+0800 JJOC[8064:3233207] message = 蓝牙关闭
后记
未完,待续~~~~