我有一个使用CoreBluetooth的iOS应用。
它可以做广告并且可以很好地连接。
当我在外围设备管理器对象上调用stopAdvertising时,它不会停止广告。我等待了大约10分钟,它仍然显示在我的蓝牙扫描仪中,并且我仍然可以连接到它。
我的iPhone是装有最新软件的iPhone X。
我没有可以检测到的错误,并且isAdvertising仍然为真。
有人知道为什么它不会停止广告吗?
答案 0 :(得分:0)
根据我在iOS上使用GATT的经验,我注意到在调用stopAdvertising
方法之后,我也必须调用removeAllServices
方法(如官方文档here所述,它只会删除您的服务)
但是,如果有任何客户端正在扫描我的GATT服务器或已连接到它,则我必须等待它们停止监视它,以使其不再被发现。
答案 1 :(得分:0)
我也有类似的经验,当应用程序处于前台时,启动和停止广告的工作就很好。为了遇到问题,我需要执行以下操作:
此时广告包如下所示:
{
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
报告正确的值(因此,即使出现我刚才描述的问题,当我停止投放广告时,它也报告“否”)答案 2 :(得分:0)
这个问题已经讨论了很多。我还向苹果报告了这是一个错误,但是他们似乎并没有积极地改变它。 造成此问题的原因是,iphone中的所有应用程序共享相同的溢出服务区,包括iphone设置中的默认蓝牙。这意味着,如果您的应用程序覆盖了GATT堆栈中的溢出区域(移至后台),则即使您杀死您的应用程序,此uuid也会生效,因为您的默认蓝牙仍通过使用此共享溢出区域而起作用,这就是其他手机的原因会找到你的。 此外,根据业务方案,很少有解决此问题的方法。
答案 3 :(得分:0)
您无法停止广告是因为您曾经将您的应用程序置于后台状态,这将覆盖溢出区域。即使您调用 stopAdvertising,它也会停止前台广告。但是,正如我所说,由于所有应用程序共享同一个溢出区域,因此该区域将保持广告(默认蓝牙设置)。为了解决这个问题,当您调用 stopadvertising 时,您必须使用另一个无意义的 uuid(如 0001)再次覆盖 GATT 堆栈。