How to know the current OS / platform of the executing code (Android / iOS)
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
Related videos on Youtube
Askolein
Updated on June 21, 2020Comments
-
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 over 10 yearsMay I ask what you want to do with that info?
-
Andrei over 10 yearspossible duplicate of How to retrieve the android sdk version?
-
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 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 over 10 yearsthanks 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 almost 8 yearsIm 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 about 3 yearsJust 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 about 2 yearstoo complicated
-
tipa almost 2 yearsthis only works on xamarin forms, not on "native" Xamarin.iOS / Xamarin.Android which is what the creator of the question is using