在iOS中广告tx功率级别

时间:2013-11-05 18:44:26

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

我目前正在编写应用程序的外围设备。我想宣传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指的是什么?< / p>

3 个答案:

答案 0 :(得分:3)

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

答案是,目前你做不到。修复代码后,它编译并运行,但CoreBluetooth只是忽略了该密钥。

the documentation所述:

  

包含您要宣传的数据的可选字典。该   广告数据字典的可能键详述   CBCentralManagerDelegate协议参考。 那说,只有两个   外围管理器对象支持键:   CBAdvertisementDataLocalNameKey和   CBAdvertisementDataServiceUUIDsKey

希望有所帮助

答案 1 :(得分:1)

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

    [self.peripheralManager startAdvertising:@{ CBAdvertisementDataTxPowerLevelKey : @(YES)}];

答案 2 :(得分:1)

由于您似乎不知道NSDictionary*对象是什么,请参阅the Apple Documentation for NSDictionary

但要回答你的问题警告

  

不兼容的指针类型将'NSString *'发送到'NSDictionary *

类型的参数

指的是

    [self.peripheralManager startAdvertising: CBAdvertisementDataTxPowerLevelKey];

是因为startAdvertising:会被声明为

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

所以它希望你传入一个NSDictionary*对象,而你传递的是一个NSString*对象。

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

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

请注意,NSDictionary*对象的简写版本从@{开始,到}结束,因此以这种方式声明NSDictionary*对象就像{ {1}}所以对你而言@{ Key : Object }

宣布这一点的第二种方式是按照我想到的正常方式来做:

@{ CBAdvertisementDataTxPowerLevelKey : @(YES) }

如果您有任何疑问,请随便询问。