swift 在蓝牙通告中传递[UInt8]字节

vwkv1x7d  于 12个月前  发布在  Swift
关注(0)|答案(1)|浏览(100)

我正在使用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])

如何传递要包含在广告中的字节数组?谢谢

ep6jt1vc

ep6jt1vc1#

CBAdvertisementDataLocalNameKey必须是字符串,如文档所示。对于您的特定示例,我希望以下内容“工作”(如“被广告”):

let customData = String(decoding: [1,2,3], as: UTF8.self)

但是,这只适用于有效的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个字节的头信息。

相关问题