How to change state of Bluetooth on iOS is PowerOn on Xamarin Forms?












0














On iOS, I only can check state of Bluetooth. I'm find the solutions on network and use it.



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;
}
}
}


But when I try turn off Bluetooth and test code, state of bluetooth is "Unknown".
Then I run code, device open settings, toggle button has color green (turn on bluetooth), but when I check state of Bluetooth in code, State of Bluetooth is "Unknown", is not "Power on".



I'm using Xamarin 3.3 and test on device iOS version 12.0.










share|improve this question





























    0














    On iOS, I only can check state of Bluetooth. I'm find the solutions on network and use it.



    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;
    }
    }
    }


    But when I try turn off Bluetooth and test code, state of bluetooth is "Unknown".
    Then I run code, device open settings, toggle button has color green (turn on bluetooth), but when I check state of Bluetooth in code, State of Bluetooth is "Unknown", is not "Power on".



    I'm using Xamarin 3.3 and test on device iOS version 12.0.










    share|improve this question



























      0












      0








      0







      On iOS, I only can check state of Bluetooth. I'm find the solutions on network and use it.



      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;
      }
      }
      }


      But when I try turn off Bluetooth and test code, state of bluetooth is "Unknown".
      Then I run code, device open settings, toggle button has color green (turn on bluetooth), but when I check state of Bluetooth in code, State of Bluetooth is "Unknown", is not "Power on".



      I'm using Xamarin 3.3 and test on device iOS version 12.0.










      share|improve this question















      On iOS, I only can check state of Bluetooth. I'm find the solutions on network and use it.



      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;
      }
      }
      }


      But when I try turn off Bluetooth and test code, state of bluetooth is "Unknown".
      Then I run code, device open settings, toggle button has color green (turn on bluetooth), but when I check state of Bluetooth in code, State of Bluetooth is "Unknown", is not "Power on".



      I'm using Xamarin 3.3 and test on device iOS version 12.0.







      xamarin xamarin.forms xamarin.ios ios-bluetooth






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 19 '18 at 15:37









      Ahmed Ashour

      3,530102442




      3,530102442










      asked Nov 19 '18 at 15:35









      Huu Bao Nguyen

      21112




      21112
























          1 Answer
          1






          active

          oldest

          votes


















          0














          I am not sure exactly what you want to do, but if your intent is to open the Bluetooth settings page, this:



          UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=Bluetooth"));


          won't work. Apple has at some points allowed this (iOS 8 IIRC) and at other points it has disallowed this (most versions of iOS). See this long SO thread about this issue: How to open Settings programmatically like in Facebook app?



          Regardless, there is no need. When iOS detects that your app has created a CBCentralManager type with delegate, iOS will display an alert to the user that allows them to go to the bluetooth settings to enable bluetooth by tapping the "Settings" button in the alert.



          As far as always getting state as "Unknown", you need to check the state in the delegate for the CBCentralManager. You cannot use the parameterless CBCentralManager constructor new CBCentralManager();. Check the apple docs: https://developer.apple.com/documentation/corebluetooth/cbcentralmanager?language=objc and note that there are only two listed init methods, one that takes delegate and queue parameters, and one that takes delegate, queue, and options parameters, although no one complains if you use the parameterless constructor... but you will never get the correct state if you use it. See: https://stackoverflow.com/a/36824770/2913599



          So try this:



          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);
          }
          }


          Bottom line: always create a CBCentralManager object with one of the following constructors:



          CBCentralManager(ICBCentralManagerDelegate, DispatchQueue)

          CBCentralManager(ICBCentralManagerDelegate, DispatchQueue, CBCentralInitOptions)





          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53377970%2fhow-to-change-state-of-bluetooth-on-ios-is-poweron-on-xamarin-forms%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            I am not sure exactly what you want to do, but if your intent is to open the Bluetooth settings page, this:



            UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=Bluetooth"));


            won't work. Apple has at some points allowed this (iOS 8 IIRC) and at other points it has disallowed this (most versions of iOS). See this long SO thread about this issue: How to open Settings programmatically like in Facebook app?



            Regardless, there is no need. When iOS detects that your app has created a CBCentralManager type with delegate, iOS will display an alert to the user that allows them to go to the bluetooth settings to enable bluetooth by tapping the "Settings" button in the alert.



            As far as always getting state as "Unknown", you need to check the state in the delegate for the CBCentralManager. You cannot use the parameterless CBCentralManager constructor new CBCentralManager();. Check the apple docs: https://developer.apple.com/documentation/corebluetooth/cbcentralmanager?language=objc and note that there are only two listed init methods, one that takes delegate and queue parameters, and one that takes delegate, queue, and options parameters, although no one complains if you use the parameterless constructor... but you will never get the correct state if you use it. See: https://stackoverflow.com/a/36824770/2913599



            So try this:



            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);
            }
            }


            Bottom line: always create a CBCentralManager object with one of the following constructors:



            CBCentralManager(ICBCentralManagerDelegate, DispatchQueue)

            CBCentralManager(ICBCentralManagerDelegate, DispatchQueue, CBCentralInitOptions)





            share|improve this answer


























              0














              I am not sure exactly what you want to do, but if your intent is to open the Bluetooth settings page, this:



              UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=Bluetooth"));


              won't work. Apple has at some points allowed this (iOS 8 IIRC) and at other points it has disallowed this (most versions of iOS). See this long SO thread about this issue: How to open Settings programmatically like in Facebook app?



              Regardless, there is no need. When iOS detects that your app has created a CBCentralManager type with delegate, iOS will display an alert to the user that allows them to go to the bluetooth settings to enable bluetooth by tapping the "Settings" button in the alert.



              As far as always getting state as "Unknown", you need to check the state in the delegate for the CBCentralManager. You cannot use the parameterless CBCentralManager constructor new CBCentralManager();. Check the apple docs: https://developer.apple.com/documentation/corebluetooth/cbcentralmanager?language=objc and note that there are only two listed init methods, one that takes delegate and queue parameters, and one that takes delegate, queue, and options parameters, although no one complains if you use the parameterless constructor... but you will never get the correct state if you use it. See: https://stackoverflow.com/a/36824770/2913599



              So try this:



              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);
              }
              }


              Bottom line: always create a CBCentralManager object with one of the following constructors:



              CBCentralManager(ICBCentralManagerDelegate, DispatchQueue)

              CBCentralManager(ICBCentralManagerDelegate, DispatchQueue, CBCentralInitOptions)





              share|improve this answer
























                0












                0








                0






                I am not sure exactly what you want to do, but if your intent is to open the Bluetooth settings page, this:



                UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=Bluetooth"));


                won't work. Apple has at some points allowed this (iOS 8 IIRC) and at other points it has disallowed this (most versions of iOS). See this long SO thread about this issue: How to open Settings programmatically like in Facebook app?



                Regardless, there is no need. When iOS detects that your app has created a CBCentralManager type with delegate, iOS will display an alert to the user that allows them to go to the bluetooth settings to enable bluetooth by tapping the "Settings" button in the alert.



                As far as always getting state as "Unknown", you need to check the state in the delegate for the CBCentralManager. You cannot use the parameterless CBCentralManager constructor new CBCentralManager();. Check the apple docs: https://developer.apple.com/documentation/corebluetooth/cbcentralmanager?language=objc and note that there are only two listed init methods, one that takes delegate and queue parameters, and one that takes delegate, queue, and options parameters, although no one complains if you use the parameterless constructor... but you will never get the correct state if you use it. See: https://stackoverflow.com/a/36824770/2913599



                So try this:



                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);
                }
                }


                Bottom line: always create a CBCentralManager object with one of the following constructors:



                CBCentralManager(ICBCentralManagerDelegate, DispatchQueue)

                CBCentralManager(ICBCentralManagerDelegate, DispatchQueue, CBCentralInitOptions)





                share|improve this answer












                I am not sure exactly what you want to do, but if your intent is to open the Bluetooth settings page, this:



                UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=Bluetooth"));


                won't work. Apple has at some points allowed this (iOS 8 IIRC) and at other points it has disallowed this (most versions of iOS). See this long SO thread about this issue: How to open Settings programmatically like in Facebook app?



                Regardless, there is no need. When iOS detects that your app has created a CBCentralManager type with delegate, iOS will display an alert to the user that allows them to go to the bluetooth settings to enable bluetooth by tapping the "Settings" button in the alert.



                As far as always getting state as "Unknown", you need to check the state in the delegate for the CBCentralManager. You cannot use the parameterless CBCentralManager constructor new CBCentralManager();. Check the apple docs: https://developer.apple.com/documentation/corebluetooth/cbcentralmanager?language=objc and note that there are only two listed init methods, one that takes delegate and queue parameters, and one that takes delegate, queue, and options parameters, although no one complains if you use the parameterless constructor... but you will never get the correct state if you use it. See: https://stackoverflow.com/a/36824770/2913599



                So try this:



                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);
                }
                }


                Bottom line: always create a CBCentralManager object with one of the following constructors:



                CBCentralManager(ICBCentralManagerDelegate, DispatchQueue)

                CBCentralManager(ICBCentralManagerDelegate, DispatchQueue, CBCentralInitOptions)






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 19 '18 at 22:06









                jgoldberger - MSFT

                3,4081827




                3,4081827






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53377970%2fhow-to-change-state-of-bluetooth-on-ios-is-poweron-on-xamarin-forms%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    MongoDB - Not Authorized To Execute Command

                    How to fix TextFormField cause rebuild widget in Flutter

                    in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith