Как изменить состояние Bluetooth на iOS - это PowerOn на Xamarin Forms? - PullRequest
0 голосов
/ 19 ноября 2018

На iOS я могу только проверить состояние Bluetooth.Я нахожу решения в сети и использую его.

public class CallBluetoothIphoneService : ICallBlueTooth
{
    public void LaunchBluetoothOnPhone()
    {
        try
        {
            // Is bluetooth enabled?
            var bluetoothManager = new CBCentralManager();
            if (bluetoothManager.State == CBCentralManagerState.PoweredOff|| bluetoothManager.State == CBCentralManagerState.Unknown)
                // Does not go directly to bluetooth on every OS version though, but opens the Settings on most
                UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=Bluetooth"));
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            throw;
        }
    }
}

Но когда я пытаюсь turn off Bluetooth и проверить код, состояние bluetooth "Неизвестно".Затем я запускаю код, настройки открытия устройства, кнопка переключения имеет зеленый цвет (включите Bluetooth), но когда я проверяю состояние Bluetooth в коде, состояние Bluetooth «Неизвестно», а не «Включение».

Я использую Xamarin 3.3 и тестирую на устройстве iOS версии 12.0.

1 Ответ

0 голосов
/ 20 ноября 2018

Я не уверен, что именно вы хотите сделать, но если вы собираетесь открыть страницу настроек 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)
...