在CBCentralManager初始化centralManagerDidUpdateState之后,它不会调用

时间:2014-03-05 12:01:33

标签: ios objective-c bluetooth-lowenergy core-bluetooth cbcentralmanager

我正在开发我的第一个蓝牙应用程序。现在我有一个AppUIview实现了一个按钮,该按钮调用AppCentralManager中将实现蓝牙功能的函数:

- (IBAction) Scan{

NSLog(@"scan function");

[[AppBluetoothCenter alloc]initialize];

}

在AppBluetoothCenter.h中,我宣布了这些功能:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>
#import <CoreBluetooth/CBService.h>
#import "AppDelegate.h"

@interface AppBluetoothCenter : NSObject <UIApplicationDelegate,CBCentralManagerDelegate, CBPeripheralDelegate>

@property CBCentralManager* CentralManager;

- (void) initialize;

@end

在AppBluetoothCenter.m中,我实现了以下功能:

#import "AppBluetoothCenter.h"

@implementation AppBluetoothCenter

-(void)initialize{
NSLog(@"initialize");

_CentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{

if (central.state == CBCentralManagerStatePoweredOff){
    NSLog(@"BLE OFF");
}
else if (central.state == CBCentralManagerStatePoweredOn){
    NSLog(@"BLE ON");
}
else if (central.state == CBCentralManagerStateUnknown){
    NSLog(@"NOT RECOGNIZED");
}
else if(central.state == CBCentralManagerStateUnsupported){
    NSLog(@"BLE NOT SUPPORTED");
}
}
@end

我在日志控制台中运行应用程序:

AppBluetooth [1273:60b]扫描功能
AppBluetooth [1273:60b]初始化

为什么不调用centralManagerDidUpdateState?

2 个答案:

答案 0 :(得分:0)

Iphone4 - 不支持bluetooth4模块。 第一个支持BLE的设备是iPhone 4s

[[AppBluetoothCenter alloc]initialize];

我不认为在alloc

之后调用initialize是个好主意

系统将为您调用初始化。

  

+ initialize是一个类方法,在创建类的任何实例之前和运行其他类方法之前运行。 +初始化不是   你大部分时间都在使用的东西,但设置任何东西都很方便   整个类可能使用的静态变量,或用于确保的静态变量   在创建任何实例之前满足某些条件。

所以把你的初始化代码 的NSLog(@ “初始化”);

_CentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

在init方法中

我认为这是麻烦

并使用init

- (IBAction) Scan{
NSLog(@"scan function");
AppBluetoothCenter* bleCenter = [[AppBluetoothCenter alloc] init];
}

这就是我的经理的样子 // H

#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block) \
static dispatch_once_t pred = 0; \
__strong static id _sharedObject = nil; \
dispatch_once(&pred, ^{ \
_sharedObject = block(); \
}); \
return _sharedObject; \

@interface MWBluetoothManager : NSObject<CBCentralManagerDelegate, CBPeripheralDelegate>
{}
+ (MWBluetoothManager *)sharedInstance;
-(void) startScan;
-(void) stopScan;
//..and other methods
@end

//中号

+ (MWBluetoothManager *)sharedInstance {
    DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
        return [[self alloc] init];
    });
}

- (id)init
{
    self = [super init];
    if (self)
    {
        _deviceList = [[NSMutableArray alloc] init];
        _metaDataForDevices = [[NSMutableDictionary alloc] init];
//        _vendor_name = {0};
        _libver = 0;
        _sendBuffer = [[NSMutableData alloc] init];        
    }
    return self;
}

-(CBCentralManager *)centralManager
{
    if (!_centralManager)
        _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    return _centralManager;
}

DEFINE_SHARED_INSTANCE_USING_BLOCK

这是针对单例模式的,大多数情况下你的应用程序中不需要蓝牙管理器的另一个实例,所以每次调用init时它都会返回相同的对象,希望有帮助

答案 1 :(得分:0)

也许这是真正的原因,你可以试试

@property (strong,nonatomic) AppBluetoothCenter *appBluetoothCenter;
…………………………
- (IBAction) Scan{

NSLog(@"scan function");

appBluetoothCenter=[[AppBluetoothCenter alloc]initialize];

}