2016-09-21 57 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