web-dev-qa-db-ja.com

iPhoneでBluetoothのステータス(オン/オフ)をプログラムで取得する方法

IPhone/iPod BluetoothのステータスをプログラムでONまたはOFFにしようとしています。いくつかのApple APIまたはサードパーティAPIを使用することは可能ですか?.

39
Nilikh

サムの答え についての少しの研究共有したいと思いましたプライベートAPIを利用せずにそうすることができますが、いくつか注意点があります:

  • IOS 5.0以降でのみ動作します
  • Bluetooth LE仕様をサポートするデバイス(iPhone 4S +、第5世代iPod +、iPad第3世代+)でのみ動作します
  • クラスを割り当てるだけで、アプリケーションはユーザーからbluetoothスタックを使用する許可を求めます(望ましくない場合があります)。拒否した場合、表示されるのはCBCentralManagerStateUnauthorizedだけです。 iOS7 +リビジョン:前述の取り消し線を防止できるようになりました。下のコメントを参照してください この回答 を参照すると、CoreBluetoothのCBCentralManagerOptionShowPowerAlertKeyオプションを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];
}
48
BadPirate

デフォルトのアラートメッセージを無効にするには、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デリゲートメソッド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
    }
}
24
Tim

この回答は、元の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")
        }
    }
}
10
CodeBender

BadPirateの回答に関するいくつかの更新、iOS7では、キー「CBCentralManagerOptionShowPowerAlertKey」が0に設定されたNSDictionaryを与えることにより、マネージャーオブジェクトを割り当てるときにアラートを表示しないように中央マネージャーを設定できます。

self.cbManager = [[CBCentralManager alloc] initWithDelegate:self
                                                          queue:nil
                                                        options:
                      [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0]
                                                  forKey:CBCentralManagerOptionShowPowerAlertKey]];
5
frankli

IOS 5以降ではCoreBluetoothを使用する方法があります。使用できるクラスはCBCentralManagerです。 Bluetoothがオンかどうかを確認できるプロパティ「状態」があります。 (列挙CBCentralManagerStateには、チェックする値があります)。

2

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 

    }
0
Raj