Я пытаюсь получить статус iPhone/iPod Bluetooth, если он включен или выключен программно. Возможно ли использовать некоторые API Apple или сторонний API.
Как получить статус bluetooth (ON/OFF) в программном обеспечении iphone
Ответ 1
Небольшое исследование Сэма ответило, что я подумаю, что поделюсь. Вы можете сделать это без использования частного API, но с несколькими оговорками:
- Он будет работать только на iOS 5. 0+
- Он будет работать только на устройствах, которые поддерживают спецификацию bluetooth LE (iPhone 4S+, 5-го поколения iPod+, iPad 3-го Generation+)
-
Простое выделение класса заставит ваше приложение запрашивать разрешение на использование стека Bluetooth у пользователя (может быть нежелательно), и если они откажутся, единственное, что вы увидите, это CBCentralManagerStateUnauthorizediOS7+ Редакция: вышеупомянутая зачеркнутая банка Теперь это будет предотвращено, см. комментарии ниже, которые указывают на этот ответ, объясняющий, что вы можете установитьCBCentralManagerOptionShowPowerAlertKey
параметра CoreBluetoothCBCentralManagerOptionShowPowerAlertKey
значение NO, чтобы предотвратить запрос разрешений. - Восстановление состояния Bluetooth является асинхронным и непрерывным. Вам нужно будет настроить делегата для получения изменений состояния, так как проверка состояния недавно выделенного менеджера Bluetooth вернет CBCentralManagerStateUnknown
Тем не менее, этот метод, по-видимому, обеспечивает в режиме реального времени обновления состояния стека Bluetooth.
После включения платформы CoreBluetooth,
#import <CoreBluetooth/CoreBluetooth.h>
Эти тесты было легко выполнить с помощью:
- (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];
}
Ответ 2
Чтобы отключить предупреждающее сообщение по умолчанию, вам просто нужно пройти через словарь параметров, когда вы создаете экземпляр CBPeripheralManager:
SWIFT проверен на 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)
Очевидно, что вам также необходимо реализовать метод делегата CKManagerDelegate периферийныйManagerDidUpdateState, как описано выше:
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
}
}
Ответ 3
Этот ответ был обновлен с исходного Objective-C до Swift 4.0.
Предполагается, что вы уже создали диспетчер bluetooth и назначили делегата классу 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")
}
}
}
Ответ 4
Некоторые обновления на BadPirate отвечают, с iOS7 вы можете настроить центральный диспетчер, чтобы он не показывал предупреждение при распределении объекта-менеджера, предоставив ему NSDictionary, у которого есть ключ "CBCentralManagerOptionShowPowerAlertKey", установленный на 0.
self.cbManager = [[CBCentralManager alloc] initWithDelegate:self
queue:nil
options:
[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0]
forKey:CBCentralManagerOptionShowPowerAlertKey]];
Ответ 5
В iOS 5 и выше есть способ использования CoreBluetooth. Класс, который вы можете использовать, - CBCentralManager. Он имеет свойство "state", которое вы можете проверить, чтобы увидеть, включен ли Bluetooth. (перечисление CBCentralManagerState имеет значение, которое вы хотите проверить).
Ответ 6
Это решение устарело до того, как Apple представит базовое 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
}