当蓝牙设备连接时,iOS Core蓝牙通知应用程序

时间:2014-11-22 04:49:19

标签: ios core-bluetooth

我已经在这个项目上工作了一段时间。当应用程序在后台的应用程序切换器中时,需要定期从蓝牙设备收集数据。

我最近的想法是使用Core Bluetooth在蓝牙设备连接时通知我的应用程序,这样我就可以检查它是否是我的设备然后做我需要做的事情。

或者我错过了解释文档时说:" didConnectPeripheral"?

我无法在CBCentralManager对象中找到该函数来启动一个"观察者"某种给我这些通知。

我在错误的道路上吗?

感谢。

代码尝试使用核心蓝牙:

CBCentralManager *mgr;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

    mgr = [CBCentralManager alloc];
    CBPeripheral *peripheral = [CBPeripheral alloc];
    [mgr connectPeripheral:peripheral options:nil];
    // Override point for customization after application launch.
    return YES;
}

- (void) mgr:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
    NSLog(@"Device Connected!");
}
- (void) mgr:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
    NSLog(@"Device Disconnected!");
}
- (void)mgr:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    NSLog(@"Did discover peripheral. peripheral: %@ rssi: %@, UUID: %@ advertisementData: %@ ", peripheral, RSSI, peripheral.UUID, advertisementData);
    //Do something when a peripheral is discovered.
}

获取错误:

2014-11-21 23:30:27.730 TelematicsService[436:185202] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
*** First throw call stack:
(0x286db49f 0x35e91c8b 0x285fb873 0x285fb657 0x283adb85 0xf005f 0x2bc084f1 0x2bdfd43f 0x2bdff98b 0x2be0a209 0x2bdfe217 0x2ee6c0d1 0x286a1d7d 0x286a1041 0x2869fb7b 0x285ed3c1 0x285ed1d3 0x2bc021bf 0x2bbfcfa1 0xf2a29 0x36411aaf)
libc++abi.dylib: terminating with uncaught exception of type NSException

由于外围设备没有完全定义,我相信

1 个答案:

答案 0 :(得分:3)

该代码至少存在两个问题。

  1. 您不应该自己创建CBPeripheral个实例。这会导致你的崩溃。 如果您需要连接到蓝牙设备,请执行

    centralManager:didDiscoverPeripheral:advertisementData:RSSI:
    

    centralManager:didRetrievePeripherals: 
    

    这些方法为您提供了有效的CBPeripheral实例。

    在您的真实应用中,您应该创建一个用户可以选择其中一个已发现设备的用户界面。您不想连接到您发现的所有设备。

  2. 应该是CBCentralManagerDelegate方法的方法被命名为错误,因此永远不会被调用。您无法更改这些方法的选择器(即“名称”)。

    正确的方法命名为:

    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
    - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
    

    您也应该实施其他人。