2016-09-21 93 views
4

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

我想写一个应用程序,可以在后台广告蓝牙服务,并能够发现此服务(最佳在后台也)。 As I already read我不能使用苹果信标技术,因为它只能在背景附近扫描/通知信标(我测试过,工作正常),但不能做广告。所以我开始使用CoreBluetooth,如上面提到的SO答案中所描述的那样可以在后台做广告。

我的应用在iPhone上的CBCentralManagerDelegate(后台应用)中调用didDiscoverPeripheral方法,因此它检测到了iPad。 CBPeripheralManager在iPhone上的isAdvertising属性是true。但是didDiscoverPeripheral未在iPad上调用。我有点困惑。其中一种选择是我的iPad由于某些原因无法检测到iPhone,或者我的iPhone正在撒谎而不是广告。

所以我认为我只是有点愚蠢和谷歌调试“CoreBluetooth调试应用程序”。我发现VicinityAltBeacon。而对于这两款应用程序,行为都是一样的!如果您背景(按Home /睡眠按钮)广告应用程序,浏览应用程序无法再发现它。如果你打开应用程序的背景,它会立即发现它。这两个应用程序都提到可以与他们一起在后台播放。

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

要确认这一点,最快的方法是在两台设备上安装Vicinity(您必须将NSBluetoothPeripheralUsageDescription键添加到Info.plist),将一台设备设置为广播并按主页按钮。

回答

4

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

也就是说,iOS中对于在后台广告GATT服务的应用程序的支持有限。这使用专有技术,只能与正在寻找这些服务的其他iOS设备一起使用。 (因为它使用了非标准的专有方案,同样的技术也不会信标广告工作,例如。)

这里是苹果如何描述它:

...你应该知道,当您的应用处于后台时进行广告的操作与您的应用处于前台时的操作不同。特别是,当您的应用在后台进行广告投放时:

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

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

+0

好。我向我的广告客户添加了一项服务,如'cbPeripheralManager!.add(CBMutableService(type:random cbuuid,primary:true))'。我将这个uuid添加到'scanForPeripheralsWithServices'。因此,苹果提到的一切都在这里完成:广告方面有一个ServiceUUID,我有一个iOS设备明确扫描它。反正不要工作。 – flashspys

+1

如果您安装了其他在后台投放广告的应用,则“溢出区域”中可能没有足够的空间。尝试卸载这些应用程序,因为它听起来像你已经尝试了几个。 – davidgyoung

+2

我删除了所有的应用程序并重新安装了我的开发应用程序。没有什么改变 – flashspys