Usa Bloothtooth LE mientras la aplicación está en segundo plano

Estoy desarrollando una aplicación para iOS con Xamarin, con este complemento BLE:

https://github.com/aritchie/bluetooth

Estoy transmitiendo un UUID a través de BLE, y funciona. Aquí está mi código:

var data = new Plugin.BluetoothLE.Server.AdvertisementData { LocalName = "MyServer", }; data.ServiceUuids.Add(new Guid("MY_UUID_HERE")); await this.server.Start(data); 

El único problema es que deja de transmitir una vez que pongo la aplicación en segundo plano. Y vuelve a aparecer cuando abro la aplicación nuevamente.

¿Cómo puedo dejar que continúe transmitiendo una vez que está en segundo plano? Leí la documentation aquí:

https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html

Y dice que tengo que usar la class CBCentralManager para get la function de conservación y restauración (para poder seguir transmitiendo el UUID en todo momento), pero estoy teniendo dificultades para traducir esto a Xamarin / C #.

EDITAR

Después de investigar un poco más, leí que necesito crear una instancia de CBCentralManager e implementar WillRestoreState en el delegado. Hice esto en AppDelegate :

 [Register("AppDelegate")] public class AppDelegate : MvxApplicationDelegate, ICBCentralManagerDelegate { private IGattServer server = CrossBleAdapter.Current.CreateGattServer(); private CBCentralManager cbCentralManager; public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions) { // irrelevant code... this.Ble(); return true; } private async Task Ble() { try { await Task.Delay(5000); // wait for it to finish initializing so I can access BLE (it crashes otherwise) var options = new CBCentralInitOptions(); options.RestoreIdentifier = "myRestoreIndentifier"; this.cbCentralManager = new CBCentralManager(this,null,options); var data = new Plugin.BluetoothLE.Server.AdvertisementData { LocalName = "MyServer", }; data.ServiceUuids.Add(new Guid("MY_UUID_HERE")); await this.server.Start(data); } catch (Exception e) { } } public void UpdatedState(CBCentralManager central) { //throw new NotImplementedException(); } [Export("centralManager:willRestoreState:")] public void WillRestoreState(CBCentralManager central, NSDictionary dict) { //never gets called } 

Pero no hizo una diferencia para mí. Y el método WillRestoreState nunca se llama … No me importa usar un complemento / biblioteca diferente si tengo que hacerlo en este punto …

EDIT 2

Acabo de darme count de que la aplicación todavía está transmitiendo mientras está en segundo plano, simplemente no veo el UUID de service (en el portal web de la baliza con la que estoy probando), solo veo el identificador del teléfono.

Después de hacer toneladas de investigación, descubrí que es simplemente una restricción de iOS: no puedes transmitir el UUID de un service BLE mientras tu aplicación está en segundo plano. El trabajo de background es muy restrictivo en iOS.

EDIT para include el comentario Paulw11 (que es cierto): puede anunciar un service, pero se anuncia de forma tal que solo otro dispositivo iOS que escanea específicamente para ese UUID de service puede ver.

Aunque no puede transmitir el UUID de un service BLE mientras su aplicación iOS está en segundo plano, para cualquier persona que intente hacer algo similar, debería search en iBeacon. Es el protocolo de Apple para dejar que las aplicaciones de iOS hagan cosas de bluetooth mientras está en segundo plano.