我正在开发我的第一个蓝牙应用程序。现在我有一个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?
答案 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];
}