CoreBluetooth stopadvertising不会停止

时间:2018-07-29 00:43:52

标签: ios bluetooth

我有一个使用CoreBluetooth的iOS应用。

它可以做广告并且可以很好地连接。

当我在外围设备管理器对象上调用stopAdvertising时,它不会停止广告。我等待了大约10分钟,它仍然显示在我的蓝牙扫描仪中,并且我仍然可以连接到它。

我的iPhone是装有最新软件的iPhone X。

我没有可以检测到的错误,并且isAdvertising仍然为真。

有人知道为什么它不会停止广告吗?

4 个答案:

答案 0 :(得分:0)

根据我在iOS上使用GATT的经验,我注意到在调用stopAdvertising方法之后,我也必须调用removeAllServices方法(如官方文档here所述,它只会删除您的服务)

但是,如果有任何客户端正在扫描我的GATT服务器或已连接到它,则我必须等待它们停止监视它,以使其不再被发现。

答案 1 :(得分:0)

我也有类似的经验,当应用程序处于前台时,启动和停止广告的工作就很好。为了遇到问题,我需要执行以下操作:

  1. 在前台启动广告
  2. 将应用置于后台
  3. 将应用置于前台

此时广告包如下所示:

{
    kCBAdvDataHashedServiceUUIDs =     (
        <my service UUID>
    );
    kCBAdvDataIsConnectable = 1;
    kCBAdvDataRxPrimaryPHY = 0;
    kCBAdvDataRxSecondaryPHY = 0;
    kCBAdvDataServiceUUIDs =     (
        <my service UUID>
    );
    kCBAdvDataTimestamp = "617105621.560463";
    kCBAdvDataTxPowerLevel = 12;
}

其中kCBAdvDataHashedServiceUUIDs字符串是CBAdvertisementDataOverflowServiceUUIDsKey常量。因此,广告包在服务和溢出区域中都包含广告的服务UUID。 在这一点上,如果我停止广告投放,则广告包装将变得像后台的一样(与我在步骤2之后观察到的相同)

{
    kCBAdvDataHashedServiceUUIDs =     (
        <my service UUID>
    );
    kCBAdvDataIsConnectable = 1;
    kCBAdvDataRxPrimaryPHY = 0;
    kCBAdvDataRxSecondaryPHY = 0;
    kCBAdvDataTimestamp = "617105621.560463";
    kCBAdvDataTxPowerLevel = 12;
}

这时,扫描我的UUID的iOS应用将通过centralManager:didDiscoverPeripheral:advertisementData:RSSI:回调方法接收通知。

在广告投放过程中杀死广告应用时,我也会遇到同样的情况。

一些注意事项:

  • isAdvertising报告正确的值(因此,即使出现我刚才描述的问题,当我停止投放广告时,它也报告“否”)
  • 我尝试了一些清理工作,就像达里昂·巴德利通(Darion Badlydone)所建议的那样
  • 通过设置停用和激活蓝牙可以修复广告

答案 2 :(得分:0)

这个问题已经讨论了很多。我还向苹果报告了这是一个错误,但是他们似乎并没有积极地改变它。 造成此问题的原因是,iphone中的所有应用程序共享相同的溢出服务区,包括iphone设置中的默认蓝牙。这意味着,如果您的应用程序覆盖了GATT堆栈中的溢出区域(移至后台),则即使您杀死您的应用程序,此uuid也会生效,因为您的默认蓝牙仍通过使用此共享溢出区域而起作用,这就是其他手机的原因会找到你的。 此外,根据业务方案,很少有解决此问题的方法。

答案 3 :(得分:0)

您无法停止广告是因为您曾经将您的应用程序置于后台状态,这将覆盖溢出区域。即使您调用 stopAdvertising,它也会停止前台广告。但是,正如我所说,由于所有应用程序共享同一个溢出区域,因此该区域将保持广告(默认蓝牙设置)。为了解决这个问题,当您调用 stopadvertising 时,您必须使用另一个无意义的 uuid(如 0001)再次覆盖 GATT 堆栈。