2

我目前正在对应用程序的外围端进行编程。我想宣传 tx 功率级别,但就 tx 文档而言,我发现的只是:

CB_EXTERN NSString * const CBAdvertisementDataTxPowerLevelKey;  // A NSNumber

我试图通过以下方式实现这一点:

/** Start advertising
 */
- (IBAction)switchChanged:(id)sender
{

    [self.peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] }];
    [self.peripheralManager startAdvertising: CBAdvertisementDataTxPowerLevelKey];

}


@end

我在最后一行代码中不断收到警告说“不兼容的指针类型将'NSString *'发送到'NSDictionary *'类型的参数。我知道我的TxPowerLevelKey是一个NSString,但是NSDictionary指的是什么?

4

3 回答 3

3

其他答案已经解决了您的字典是如何定义的,但是,您正在寻找更高级别的问题;如何从 iOS 设备传输 txPower 电平。

答案是目前你不能。修复代码后,它会编译并运行,但 CoreBluetooth 只是忽略了该键。

文档所述

包含您要宣传的数据的可选字典。CBCentralManagerDelegate 协议参考中详细介绍了可能的广告数据字典键。也就是说,外围管理器对象仅支持其中两个键:CBAdvertisementDataLocalNameKey 和 CBAdvertisementDataServiceUUIDsKey。

希望有帮助

于 2014-09-03T19:13:47.997 回答
1

在 Objective-C 中,@{}[NSDictionary dictionaryWithObjectsAndKeys:(id), ..., nil]. 警告表明 -[PeripheralManager startAdvertising] 方法需要一个 NSDictionary。尝试使用 Boolean True 值将键包装在字典中(表示为 NSNumber 对象@(YES)):

    [self.peripheralManager startAdvertising:@{ CBAdvertisementDataTxPowerLevelKey : @(YES)}];
于 2013-11-05T19:18:49.320 回答
0

由于您似乎不知道NSDictionary*对象是什么,请参阅NSDictionary 的 Apple 文档

但要回答你的问题,警告

不兼容的指针类型将“NSString*”发送到“NSDictionary*”类型的参数

这是指

    [self.peripheralManager startAdvertising: CBAdvertisementDataTxPowerLevelKey];

是因为startAdvertising:将被声明为

- (void)startAdvertising:(NSDictionary *)start;

因此,它期望您传递一个NSDictionary*对象,而此时您正在传递一个NSString*对象。

您可以通过以下两种方式之一解决此问题。第一种方法是像您在这里所做的那样使用简写方式

      [self.peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] }];

请注意,对象的简写版本NSDictionary*开始于@{并结束于,}因此以这种方式声明一个NSDictionary*对象对您来说就像@{ Key : Object }这样@{ CBAdvertisementDataTxPowerLevelKey : @(YES) }

声明这一点的第二种方法是按照我认为的正常方式进行操作,例如:

    [NSDictionary dictionaryWithObjectsAndKeys:@(YES), CBAdvertisementDataTxPowerLevelKey, nil]

如果您有任何问题,请尽管问。

于 2013-11-05T19:32:25.213 回答