我正在使用Xamarin构建一款iOS应用程序,使用以下BLE插件:
https://github.com/aritchie/bluetoothle 我只是通过BLE广播UUID,并且它运作正常。下面是我的代码:
唯一的问题是,一旦我将应用程序放到后台,它就停止广播。当我再次打开应用程序时,它会恢复广播。
如何让它在后台继续广播?我阅读了这里的文档:
https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html
它说我必须使用CBCentralManager类获取保留和还原功能(这样我就可以始终保持UUID广播),但我很难将其翻译成Xamarin / C#。
编辑
经过更多研究,我发现我需要创建一个CBCentralManager实例并在委托中实现WillRestoreState。我在AppDelegate中完成了此操作:
但对我来说没有任何影响,而且
https://github.com/aritchie/bluetoothle 我只是通过BLE广播UUID,并且它运作正常。下面是我的代码:
var data = new Plugin.BluetoothLE.Server.AdvertisementData
{
LocalName = "MyServer",
};
data.ServiceUuids.Add(new Guid("MY_UUID_HERE"));
await this.server.Start(data);
唯一的问题是,一旦我将应用程序放到后台,它就停止广播。当我再次打开应用程序时,它会恢复广播。
如何让它在后台继续广播?我阅读了这里的文档:
https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html
它说我必须使用CBCentralManager类获取保留和还原功能(这样我就可以始终保持UUID广播),但我很难将其翻译成Xamarin / C#。
编辑
经过更多研究,我发现我需要创建一个CBCentralManager实例并在委托中实现WillRestoreState。我在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
}
但对我来说没有任何影响,而且
WillRestoreState
方法从未被调用......如果必须的话,我现在也不介意使用其他插件/库...
编辑2
我刚意识到应用程序在后台仍在广播,只是我再也看不到服务UUID了(在我正在测试的信标的Web门户中),我只能看到手机的标识符。