我目前正在编写应用程序的外围设备。我想宣传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>
答案 0 :(得分:3)
其他答案已经解决了如何定义词典,但是,您正在寻找更高级别的问题;如何从iOS设备传输txPower级别。
答案是,目前你做不到。修复代码后,它编译并运行,但CoreBluetooth只是忽略了该密钥。
包含您要宣传的数据的可选字典。该 广告数据字典的可能键详述 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) }
如果您有任何疑问,请随便询问。