如何知道正在执行的代码的当前操作系统/平台(Android / iOS)

57

使用Xamarin.Android和Xamarin.iOS,我需要在共享代码部分知道当前的操作系统。无论是枚举、整数还是字符串都可以。

我尝试了这个:


System.Environment.OSVersion

这个通常是带有一些内核版本信息的"Unix"。

例如,Android上有相关信息。

Android.OS.Build.VERSION

但它需要在 Android 特定的代码部分中。有没有办法在公共库中知道当前的操作系统?


请问您想用那些信息做什么? - Daniel Hilgarth
可能是重复的问题:如何检索Android SDK版本? - Andrei
@Daniel:我的服务器(提供数据和服务)需要知道“谁”正在进行请求(记录、推送通知、一些特定的UI数据...) - Askolein
2
@Andrei:不是的。你所涉及到的问题只涉及Android SDK版本。我需要区分Android/iOS之间的差异。 - Askolein
3个回答

136

你也可以尝试这个,这可能是我找到的最好的解决方案:

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

}

2
为了增强这个答案,我们还可以使用Xamarin.Essentials和DeviceInfo API。DeviceInfo.Platform也会返回平台,例如“Android”。 - jfmg
1
这仅适用于Xamarin Forms,而不适用于“本机” Xamarin.iOS / Xamarin.Android,这是问题的创建者正在使用的内容。 - tipa

6
我将使用DeviceInfo插件进行翻译,该插件支持Android, iOs, Windows Phone Silverlight, Windows Phone RT, Windows Store RT, Windows 10 UWP平台且完美运行。

在PCL中可按如下方式使用(需将插件添加到平台项目和PCL):

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

PCL中,这种代码并不是一个好的实践,最好使用依赖注入(此插件使用该方法)来自定义特定平台的行为。


你的链接已经失效。 - Simon Mourier

3

使用反射来尝试检索Monotouch.Version属性的值(以及MfA的等效项:Android.OS.Build.VERSION)。其中一个调用将失败,另一个应该成功;这就是为什么你必须使用反射。这是实时运行时检查。

但由于您的应用程序被编译了两次,因此可以在编译时修复该值。

#if MONOTOUCH
    var platform = "iOS"
#else
    var platform = "Android"
#endif

感谢提供这些解决方案。我希望还有其他的解决方案存在。这些解决方案需要手动处理任何新平台(例如Windows)。虽然这不是什么大问题,但我觉得奇怪的是Xamarin在其API中没有提供这样的服务。 - Askolein
我正在使用Xamarin iOS 9.6.2,Xamarin Android 6.0.4.0和Xamarin Studio 5.10.3。MONOTOUCH符号不存在。那个#ifdef总是进入else分支。是的,我将iOS项目设置为默认值。有什么替代方案吗? - jzeferino
太复杂了 - Ferenc Dajka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接