ios 如何以编程方式获取 iphone 中蓝牙(开/关)的状态
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4955007/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get the status of bluetooth (ON/OFF) in iphone programmatically
提问by Nilikh
I trying to get the Status of iPhone/iPod Bluetooth that whether it is ON or OFF programmatically. Is it possible using some Apple API or third party API.
我试图以编程方式获取 iPhone/iPod 蓝牙的状态,无论它是打开还是关闭。是否可以使用某些 Apple API 或第三方 API。
回答by BadPirate
A little bit of research into Sam's answerthat I thought I'd share You can do so without utilizing private API, but with a few caveats:
对Sam 的回答进行了一些研究,我想我会分享您可以在不使用私有 API 的情况下这样做,但有一些警告:
- It will only work on iOS 5.0+
- It will only work on devices that support the bluetooth LE spec (iPhone 4S+, 5th Generation iPod+, iPad 3rd Generation+)
Simply allocating the class will cause your application to ask permission to use the bluetooth stack from the user (may not be desired), and if they refuse, the only thing you'll see is CBCentralManagerStateUnauthorizediOS7+ Revision: Aforementioned strike-through can now be prevented, see comments below which point to this answerwhich explains you can set CoreBluetooth'sCBCentralManagerOptionShowPowerAlertKey
option to NO to prevent permissions prompt.- Retrieval of bluetooth state is async, and continuous. You will need to setup a delegate to get state changes, as checking the state of a freshly allocated bluetooth manager will return CBCentralManagerStateUnknown
- 它仅适用于 iOS 5.0+
- 它仅适用于支持蓝牙 LE 规格的设备(iPhone 4S+、第 5 代 iPod+、第 3 代 iPad+)
简单地分配类将导致您的应用程序向用户请求使用蓝牙堆栈的许可(可能不需要),如果他们拒绝,您将唯一看到的是 CBCentralManagerStateUnauthorizediOS7+ 修订版:上述删除线现在可以是阻止,请参阅下面指向此答案的评论,其中说明您可以将 CoreBluetooth 的CBCentralManagerOptionShowPowerAlertKey
选项设置为 NO 以阻止权限提示。- 蓝牙状态的检索是异步和连续的。您需要设置一个委托来获取状态更改,因为检查新分配的蓝牙管理器的状态将返回 CBCentralManagerStateUnknown
That being said, this method does seem to provide real time updates of bluetooth stack state.
话虽如此,这种方法似乎确实提供了蓝牙堆栈状态的实时更新。
After including the CoreBluetooth framework,
在包含 CoreBluetooth 框架之后,
#import <CoreBluetooth/CoreBluetooth.h>
These tests were easy to perform using:
这些测试很容易使用:
- (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];
}
回答by Tim
To disable the default alert message you just need to pass through an option dictionary when you instantiate the CBPeripheralManager:
要禁用默认警报消息,您只需要在实例化 CBPeripheralManager 时传递一个选项字典:
SWIFT tested on iOS8+
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)
Obviously you also need to implement the CKManagerDelegate delegate method peripheralManagerDidUpdateState as outlined above as well:
显然,您还需要实现上面概述的 CKManagerDelegate 委托方法peripheralManagerDidUpdateState:
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
}
}
回答by CodeBender
This answer has been updated from the original Objective-C to Swift 4.0.
这个答案已经从原来的 Objective-C 更新到 Swift 4.0。
It is assumed that you have already created a bluetooth manager and assigned the delegate to the ViewController
class.
假设您已经创建了一个蓝牙管理器并将委托分配给了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")
}
}
}
回答by frankli
Some updates on BadPirate's answer, with iOS7 you can set the central manager not to show the alert when allocating the manager object by giving it a NSDictionary that has key "CBCentralManagerOptionShowPowerAlertKey" set to 0.
BadPirate 答案的一些更新,使用 iOS7,您可以设置中央管理器在分配管理器对象时不显示警报,方法是为其提供一个 NSDictionary,该 NSDictionary 的密钥“CBCentralManagerOptionShowPowerAlertKey”设置为 0。
self.cbManager = [[CBCentralManager alloc] initWithDelegate:self
queue:nil
options:
[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0]
forKey:CBCentralManagerOptionShowPowerAlertKey]];
回答by Sam Griffith Jr.
There is a way on iOS 5 and above using CoreBluetooth. The class you can use is CBCentralManager. It has a property 'state' that you can check to see if Bluetooth is on or not. (the enum CBCentralManagerState has the value(s) you want to check against).
在 iOS 5 及更高版本上有一种使用 CoreBluetooth 的方法。您可以使用的类是 CBCentralManager。它有一个属性“状态”,您可以检查蓝牙是否打开。(枚举 CBCentralManagerState 具有您要检查的值)。
回答by SoftDesigner
Once you have the CBCentralManager
setup you can use CBCentralManager::state
and CBCentralManager::authorization
either from a delegate methodor directly.
完成CBCentralManager
设置后,您可以使用CBCentralManager::state
和CBCentralManager::authorization
从委托方法或直接使用。
import CoreBluetooth
class Manager {
let centralManager = CBCentralManager(delegate: self, queue: nil)
var isBTTurnedOn: Bool {
return centralManager.state == .poweredOn
}
var isAuthorized: Bool {
if #available(iOS 13.0, *) {
return centralManager.authorization == .allowedAlways
} else {
return true
}
}
}
回答by Raj
This solution is bit old , before apple introducing core 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
}