J'essaie d'obtenir le statut de l'iPhone/iPod Bluetooth, qu'il soit activé ou désactivé par programme ... Est-il possible d'utiliser une API Apple ou une API tierce.
Un peu de recherche sur la réponse de Sam que je pensais partagerVous pouvez le faire sans utiliser une API privée, mais avec quelques réserves:
CBCentralManagerOptionShowPowerAlertKey
de CoreBluetooth sur NO pour empêcher les autorisations Invite. Cela étant dit, cette méthode semble fournir des mises à jour en temps réel de l'état de la pile Bluetooth.
Après avoir inclus le framework CoreBluetooth,
#import <CoreBluetooth/CoreBluetooth.h>
Ces tests étaient faciles à effectuer en utilisant:
- (void)detectBluetooth
{
if(!self.bluetoothManager)
{
// Put on main queue so we can call UIAlertView from delegate callbacks.
self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
}
[self centralManagerDidUpdateState:self.bluetoothManager]; // Show initial state
}
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
NSString *stateString = nil;
switch(self.bluetoothManager.state)
{
case CBCentralManagerStateResetting: stateString = @"The connection with the system service was momentarily lost, update imminent."; break;
case CBCentralManagerStateUnsupported: stateString = @"The platform doesn't support Bluetooth Low Energy."; break;
case CBCentralManagerStateUnauthorized: stateString = @"The app is not authorized to use Bluetooth Low Energy."; break;
case CBCentralManagerStatePoweredOff: stateString = @"Bluetooth is currently powered off."; break;
case CBCentralManagerStatePoweredOn: stateString = @"Bluetooth is currently powered on and available to use."; break;
default: stateString = @"State unknown, update imminent."; break;
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Bluetooth state"
message:stateString
delegate:nil
cancelButtonTitle:@"ok" otherButtonTitles: nil];
[alert show];
}
Pour désactiver le message d'alerte par défaut, il vous suffit de passer par un dictionnaire d'options lorsque vous instanciez CBPeripheralManager:
Swift testé sur iOS8 +
import CoreBluetooth
//Define class variable in your VC/AppDelegate
var bluetoothPeripheralManager: CBPeripheralManager?
//On viewDidLoad/didFinishLaunchingWithOptions
let options = [CBCentralManagerOptionShowPowerAlertKey:0] //<-this is the magic bit!
bluetoothPeripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: options)
Bien entendu, vous devez également implémenter la méthode déléguée CKManagerDelegate, périphériqueManagerDidUpdateState, comme indiqué ci-dessus:
func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager!) {
var statusMessage = ""
switch peripheral.state {
case .poweredOn:
statusMessage = "Bluetooth Status: Turned On"
case .poweredOff:
statusMessage = "Bluetooth Status: Turned Off"
case .resetting:
statusMessage = "Bluetooth Status: Resetting"
case .unauthorized:
statusMessage = "Bluetooth Status: Not Authorized"
case .unsupported:
statusMessage = "Bluetooth Status: Not Supported"
case .unknown:
statusMessage = "Bluetooth Status: Unknown"
}
print(statusMessage)
if peripheral.state == .poweredOff {
//TODO: Update this property in an App Manager class
}
}
Cette réponse a été mise à jour d'Objective-C d'origine à Swift 4.0.
Il est supposé que vous avez déjà créé un gestionnaire Bluetooth et affecté le délégué à la classe ViewController
.
import CoreBluetooth
extension ViewController : CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch central.state {
case .poweredOn:
print("powered on")
case .poweredOff:
print("powered off")
case .resetting:
print("resetting")
case .unauthorized:
print("unauthorized")
case .unsupported:
print("unsupported")
case .unknown:
print("unknown")
}
}
}
Certaines mises à jour sur la réponse de BadPirate. Avec iOS7, vous pouvez configurer le gestionnaire central pour ne pas afficher l'alerte lors de l'allocation de l'objet gestionnaire en lui attribuant un NSDictionary dont la clé est "CBCentralManagerOptionShowPowerAlertKey".
self.cbManager = [[CBCentralManager alloc] initWithDelegate:self
queue:nil
options:
[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0]
forKey:CBCentralManagerOptionShowPowerAlertKey]];
Il y a un moyen d'utiliser iOS 5 ou plus avec CoreBluetooth. La classe que vous pouvez utiliser est CBCentralManager. Il a une propriété «état» que vous pouvez vérifier pour voir si Bluetooth est activé ou non. (l'énumération CBCentralManagerState a la ou les valeurs que vous souhaitez vérifier).
Cette solution est un peu ancienne, avant qu'Apple n'introduise le noyau Bluetooth
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
Class BluetoothManager = objc_getClass( "BluetoothManager" ) ;
id btCont = [BluetoothManager sharedInstance] ;
[self performSelector:@selector(status:) withObject:btCont afterDelay:1.0f] ;
return YES ;
}
- (void)status:(id)btCont
{
BOOL currentState = [btCont enabled] ;
//check the value of currentState
}