How to know the current OS / platform of the executing code (Android / iOS)

37,093

Solution 1

You can also try this and its probably the best solution I found :

if(Device.RuntimePlatform == Device.iOS)
{
    //iOS stuff
}
else if(Device.RuntimePlatform == Device.Android)
{

}

Solution 2

I'm using DeviceInfo plugin. It supports Android, iOs, Windows Phone Silverlight, Windows Phone RT, Windows Store RT, Windows 10 UWP and it works perfectly.

It can be used in PCL like this (you must add the plugin to the platform projects and to PCL):

var platform = CrossDeviceInfo.Current.Platform;
    switch(platform){
        case Platform.iOS:
            // iOS
            break;
        case Platform.Android:
            // Android
            break; 
    }

This kind of code isn't a good practice in PCL, its better to use Dependency Injection (this plugin use that) to customize platform specific behaviour.

Solution 3

Using reflection, try to retrieve the value of the Monotouch.Version property (and the equivalent for MfA: Android.OS.Build.VERSION). One of the calls will fail, the other should succeed; that's why you have to use reflection. That's for a real runtime check.

But as your app is compiled twice, you can fix that value at compile time.

#if MONOTOUCH
    var platform = "iOS"
#else
    var platform = "Android"
#endif
Share:
37,093

Related videos on Youtube

Askolein
Author by

Askolein

Updated on June 21, 2020

Comments

  • Askolein
    Askolein almost 4 years

    Using Xamarin.Android and Xamarin.iOS, I need to now the current OS in a shared code section. Be it an enum, an int or a string, it doesn't matter.

    I tried this:

    System.Environment.OSVersion
    

    Which is always "Unix" with some kernel version informations.

    There are info on Android for example like

    Android.OS.Build.VERSION
    

    But it needs to be in the Android specific code section. Is there any way of knowing the current OS in a common library?

    • Daniel Hilgarth
      Daniel Hilgarth over 10 years
      May I ask what you want to do with that info?
    • Andrei
      Andrei over 10 years
    • Askolein
      Askolein over 10 years
      @Daniel: my server (providing data and service) needs to know who is making the request (logging, push notifications, some specific data for the UI...)
    • Askolein
      Askolein over 10 years
      @Andrei: nope. The question you're relating to is about Android only SDK version. I need to have a discriminant between Android/iOS.
  • Askolein
    Askolein over 10 years
    thanks for those solutions. I hoped another one exists. Those imply you to handle any new platform (aka windows) by hand. Not a big issue indeed but it seems strange to me that Xamarin does not provide suche service in its API.
  • jzeferino
    jzeferino almost 8 years
    Im using Xamarin iOS 9.6.2, Xamarin Android 6.0.4.0 and Xamarin Studio 5.10.3. The MONOTOUCH symbol don't exist. That #ifdef always go to the else. Yes im setting the iOS project as default. Any alternative?
  • jfmg
    jfmg about 3 years
    Just to enhance this answer, one can also use Xamarin.Essentials with the DeviceInfo API. DeviceInfo.Platform will also return the platform, e.g. 'Android'.
  • Ferenc Dajka
    Ferenc Dajka about 2 years
    too complicated
  • tipa
    tipa almost 2 years
    this only works on xamarin forms, not on "native" Xamarin.iOS / Xamarin.Android which is what the creator of the question is using