0

Bluetooth デバイスが iOS デバイスに接続されているかどうかを追跡しようとしています。次のコードを使用しました。

#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>


@interface scDeviceManager:NSObject <CBCentralManagerDelegate>
@property (nonatomic, strong) CBCentralManager *centralManager;

+ (scDeviceManager *) sharedInstance;

@end

#import "scDeviceManager.h"


@implementation scDeviceManager
@synthesize centralManager = _centralManager;


+ (scDeviceManager *) sharedInstance {

    static scDeviceManager *_sharedInstance=nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });

    return _sharedInstance;
}

- (id)init {

    if (self = [super init]) { // equivalent to "self does not equal nil"

        _centralManager=[[CBCentralManager alloc] initWithDelegate:self queue:nil];
        //also tried
        //_centralManager=[[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];

    }
    return self;
}


- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {

    NSLog(@"Peripheral connected");
}




- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
    _log=[[Logger alloc] initWithClassName:NSStringFromClass([self class])];

    switch (central.state) {
        case CBCentralManagerStatePoweredOff:
            NSLog(@"CoreBluetooth BLE hardware is powered off.");

            break;
        case CBCentralManagerStatePoweredOn:
            NSLog(@"CoreBluetooth BLE hardware is powered on and ready.");
            [_centralManager scanForPeripheralsWithServices:nil options:nil];
            break;
        case CBCentralManagerStateResetting:
            NSLog(@"CoreBluetooth BLE hardware is resetting.");
            break;
        case CBCentralManagerStateUnauthorized:
            NSLog(@"CoreBluetooth BLE state is unauthorized.");
            break;
        case CBCentralManagerStateUnknown:
            NSLog(@"CoreBluetooth BLE state is unknown.");
            break;
        case CBCentralManagerStateUnsupported:
            NSLog(@"CoreBluetooth BLE hardware is unsupported on this platform.");
            break;
        default:
            NSLog([NSString stringWithFormat:@"Nothing to do: state (%ld).",(long)central.state]);
            break;
    }
}

@end;

ある時点で、オブジェクト scDeviceManager を呼び出します。

scDeviceManager *deviceManager = [scDeviceManager sharedInstance];

iOS から Bluetooth を有効化/無効化すると、次のメッセージが表示されます。

2016-04-27 13:33:21.940 CoreBluetooth BLE ハードウェアの電源がオフになっています。

2016-04-27 13:33:24.046 CoreBluetooth BLE ハードウェアの電源がオンになり、準備が整いました。

これは、Bluetooth がアクティブ化されており、新しい Bluetooth デバイスをスキャンしていることを示しています。

ただし、Bluetooth デバイス (samsung HM1700、Bluetooth ヘッドセット) を接続すると、didConnectPeripheral は呼び出されません。音楽を聴くことができるので、Bluetoothデバイスが接続されていることを確認してください。

カスタム iOS ボタンでは、次の関数を呼び出します

-(void) scanConnectedDevices{

    NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs];
    for (AVAudioSessionPortDescription *port in inputs)
    {
        connectedAudioDevices[port.portType]=port;
        NSLog(@"type:%@, name:%@",port.portyType,port.portName)
    }

}

そして、私が得るものは次のとおりです。

マイク内蔵:iPhone マイク

BluetoothHFP:HM1700

これは、デバイスが接続されていることを示します。ただし、Bluetoothデバイスを接続/切断するたびに、デリゲートを介してコードの平和を実行したいと思います。

ありがとう

4

1 に答える 1

0

物事を混ぜるのがいかに簡単かがわかります ;)

あなたがやっていること: 基本的にメモリ内に bluetooth インスタンスを作成しています。次に、設定を介して別のBluetoothデバイスに接続します結果:2つのことは互いに関連していません->「コード」は、別の場所から接続したヘッドセットについて何も知りません...

別の bluetooth デバイスが接続されているかどうかを確認しようとしている場合: おそらく、MFI プログラムのメンバーになる必要があり、その後、独自に製造されたヘッドセットに接続できるようになります。

それ以外の場合、私の知る限り、接続された「クラシック」Bluetoothデバイスを単に「リスト」する方法はiOSにはありません。

于 2016-04-29T09:17:38.927 に答える