我正在使用CBPeripheralManager在运行iOS 16.5的iPhone 13上播放广告。我正在尝试在CBAdvertisementDataLocalNameKey中包含数据,但没有看到预期的行为。
以下工程:
let customData: String = "789"
peripheralManager.startAdvertising([CBAdvertisementDataLocalNameKey: customData])
但下面的不起作用。没有看到错误,但数据只是没有出现在广告中。
let customData: [UInt8] = [1,2,3]
peripheralManager.startAdvertising([CBAdvertisementDataLocalNameKey: customData])
如何传递要包含在广告中的字节数组?谢谢
1条答案
按热度按时间ep6jt1vc1#
CBAdvertisementDataLocalNameKey必须是字符串,如文档所示。对于您的特定示例,我希望以下内容“工作”(如“被广告”):
但是,这只适用于有效的UTF8字节序列(这恰好是)。非UTF8字节序列在此字段中无效。这不是iOS限制;这是蓝牙要求在CSS v11的1.2节中,定义了本地名称字段:
本地名称数据类型应与分配给器械的本地名称相同,或者是其缩短版本。“本地名称”数据类型值指示名称是完整的还是缩短的。[...]
缩写名称应仅包含从全名开始的连续字符。例如,如果设备名称是'BT_Device_Name',则缩短的名称可以是'BT_Device'或'BT_Dev'。
然后将类型指定为
utf8s
。“分配给设备的本地名称”来自Core Specification,版本5.3,第6.23节:类型为
utf8{248}
的设备的UTF-8编码的用户友好描述性名称。您不能在此处放置随机字节。
将此字段用于随机字符串,即使它们在技术上是“有效的”,也会违反此字段的规则,并且会让扫描设备的用户感到沮丧。它们将在列表中显示为乱码。请避免对用户这样做。
如果你想在广告包中放入随机字节,它们将进入the Manufacturer Data。你可以把任何你喜欢的字节放在那里。(请看下面的评论:iOS不允许这样做。很有可能苹果没有提供任何方法来宣传任意数据,特别是因为多个应用程序可能同时尝试这样做。
请记住,从the docs:
由于空间有限,并且可能有多个应用程序同时进行广告,因此Core Bluetooth会在“尽力而为”的基础上广告数据。在前台时,您的应用最多可以在初始广告数据中使用28字节的空间,用于支持的广告数据键的任意组合。如果没有这个空间,则扫描响应中还有另外10个字节的空间,仅可用于本地名称(由CBAdvertisementDataLocalNameKey键的值表示)。请注意,这些大小不包括每个新数据类型所需的2个字节的头信息。