在iOS 10的背景CoreBluetooth广告

首先:我有一台iPad Air 2和一台iPhone 7.为了进一步阅读,我们估计该应用在iPad上处于活动状态,并在iPhone上以后台模式打开。 该应用程序是完全相同的,即使使用相同的蓝牙服务UUID和相同的DataLocalNameKey。

我想写一个应用程序,可以在后台广告一个蓝牙服务,并能够发现这个服务(最佳的背景也)。 正如我已经阅读,我不能使用苹果信标技术,因为它只能在背景附近扫描/通知信标(我testing这个,工作正常),但不能做广告。 所以我开始使用CoreBluetooth所描述的SO回答的原因那里有可能在后台做广告。

我的应用程序调用iPhone上的didDiscoverPeripheral方法(应用程序在后台),所以它检测到了iPad。 CBPeripheralManager在iPhone上的isAdvertising属性是true 。 但didDiscoverPeripheral没有在iPad上调用。 我有点困惑。 其中一个select是我的iPad不能够检测到iPhone由于某种原因,或者我的iPhone在撒谎,而不是广告。

所以我觉得我只是一个愚蠢和谷歌search“CoreBluetoothdebugging应用程序”一点点。 我find了附近和AltBeacon 。 而与这两个应用程序的行为是一样的! 如果您背景(按Home /睡眠button)的广告应用程序,浏览应用程序无法发现它了。 如果你打开应用程序的背景,它会立即发现它。 这两个应用程序都提到可能与他们在后台播放。

难道我做错了什么; 这是预期的行为? 我误解了框架吗? 你能证实这种行为吗?

为了确认这一点,最快的方法是在两台设备上安装Vicinity (您必须将NSBluetoothPeripheralUsageDescription添加到设备上),设置一台设备进行广播,然后按主页button。

这是ios 10.0(1)中的一个错误, 部分修复了ios 10.1

src: https : //forums.developer.apple.com/thread/51309

这不是特定于iOS 10的任何东西 – iOS上一直如此。 在iOS上,应用程序在后台无法发送标准的蓝牙LE广告 。 他们必须在前台来做到这一点。

也就是说,iOS中的GATT服务广告背景支持有限。 这使用了一种专有技术,只能与其他正在寻找这些服务的iOS设备一起使用。 (因为它使用非标准的专有scheme,例如,相同的技术将不适用于信标广告。)

以下是苹果公司描述它的方式:

…你应该知道,当你的应用程序在后台进行广告的操作与当你的应用程序处于前台的时候有所不同。 特别是,当你的应用程序在后台进行广告时:

  • CBAdvertisementDataLocalNameKey通告密钥被忽略,外设的本地名称不被公布。
  • CBAdvertisementDataServiceUUIDsKey通告密钥的值中包含的所有服务UUID都放置在特殊的“溢出”区域中; 它们只能被明确扫描它们的iOS设备发现。
  • 如果所有正在进行广告的应用程序都在后台,则外围设备发送广告数据包的频率可能会降低。

在这里阅读更多: https : //developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html