Я не уверен, что именно вы хотите сделать, но если вы собираетесь открыть страницу настроек Bluetooth, это:
UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=Bluetooth"));
не будет работать.Apple в некоторых случаях разрешала это (iOS 8 IIRC), а в других случаях это запрещала (большинство версий iOS).Посмотрите эту длинную тему SO по этой проблеме: Как программно открыть настройки, как в приложении Facebook?
В любом случае, в этом нет необходимости.Когда iOS обнаруживает, что ваше приложение создало тип CBCentralManager с делегатом, iOS отобразит предупреждение для пользователя, которое позволяет им перейти к настройкам Bluetooth для включения Bluetooth, нажав кнопку «Настройки» в предупреждении.
Чтобы всегда получать состояние как "Неизвестно", необходимо проверить состояние в делегате для CBCentralManager.Вы не можете использовать конструктор CBCentralManager без параметров new CBCentralManager();
.Проверьте документы Apple: https://developer.apple.com/documentation/corebluetooth/cbcentralmanager?language=objc и обратите внимание, что в списке есть только два метода init
, один из которых принимает параметры делегата и очереди, а другой - параметры делегата, очереди и параметров, хотя никто не будет жаловаться, если выиспользуйте конструктор без параметров ... но вы никогда не получите правильное состояние, если будете его использовать.См .: https://stackoverflow.com/a/36824770/2913599
Так попробуйте это:
public class CallBluetoothIphoneService : ICallBluetooth
{
public void LaunchBluetoothOnPhone()
{
try
{
// Is bluetooth enabled?
var bluetoothManager = new CBCentralManager(new MySimpleCBCentralManagerDelegate(), DispatchQueue.CurrentQueue);
// This will always show state "Unknown". You need to check it in the delegate's UpdatedState method
Console.WriteLine($"State: {bluetoothManager.State.ToString()}");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
public class MySimpleCBCentralManagerDelegate : CBCentralManagerDelegate
{
override public void UpdatedState(CBCentralManager mgr)
{
// You can check the state in this delegate method
Console.WriteLine($"UpdatedState: {mgr.State.ToString()}");
if (mgr.State == CBCentralManagerState.PoweredOn)
{
//Passing in null scans for all peripherals. Peripherals can be targeted by using CBUIIDs
CBUUID[] cbuuids = null;
mgr.ScanForPeripherals(cbuuids); //Initiates async calls of DiscoveredPeripheral
//Timeout after 30 seconds
var timer = new Timer(30 * 1000);
timer.Elapsed += (sender, e) => mgr.StopScan();
}
else
{
//Invalid state -- Bluetooth powered down, unavailable, etc.
System.Console.WriteLine("Bluetooth is not available");
}
}
public override void DiscoveredPeripheral(CBCentralManager central, CBPeripheral peripheral, NSDictionary advertisementData, NSNumber RSSI)
{
Console.WriteLine("Discovered {0}, data {1}, RSSI {2}", peripheral.Name, advertisementData, RSSI);
}
}
Итог: всегда создавайте объект CBCentralManager с одним из следующих конструкторов:
CBCentralManager(ICBCentralManagerDelegate, DispatchQueue)
CBCentralManager(ICBCentralManagerDelegate, DispatchQueue, CBCentralInitOptions)