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

Posted

技术标签:

【中文标题】如何知道当前执行代码的操作系统/平台(Android/iOS)【英文标题】:How to know the current OS / platform of the executing code (Android / iOS) 【发布时间】:2013-09-05 10:11:26 【问题描述】:

使用 Xamarin.android 和 Xamarin.ios,我现在需要共享代码部分中的当前操作系统。无论是枚举、整数还是字符串,都无所谓。

我试过了:

System.Environment.OSVersion

它总是带有一些内核版本信息的“Unix”。

Android 上有一些信息,例如

Android.OS.Build.VERSION

但它需要在 Android 特定的代码部分。 有什么方法可以知道公共库中的当前操作系统吗?

【问题讨论】:

请问你想用这些信息做什么? How to retrieve the android sdk version? 的可能重复项 @Daniel:我的服务器(提供数据和服务)需要知道who 正在发出请求(日志记录、推送通知、UI 的一些特定数据......) @Andrei:不。您所涉及的问题是关于仅限 Android 的 SDK 版本。我需要区分 Android/iOS。 【参考方案1】:

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

if(Device.RuntimePlatform == Device.iOS)

    //iOS stuff

else if(Device.RuntimePlatform == Device.Android)



【讨论】:

只是为了增强这个答案,还可以将 Xamarin.Essentials 与 DeviceInfo API 一起使用。 DeviceInfo.Platform 也将返回平台,例如'安卓'。【参考方案2】:

我正在使用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 中不是一个好习惯,最好使用Dependency Injection(这个插件使用它)来自定义平台特定的行为。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

感谢这些解决方案。我希望另一个存在。这些意味着您要手动处理任何新平台(又名窗口)。确实不是什么大问题,但我觉得 Xamarin 没有在其 API 中提供此类服务似乎很奇怪。 我正在使用 Xamarin iOS 9.6.2、Xamarin Android 6.0.4.0 和 Xamarin Studio 5.10.3。 MONOTOUCH 符号不存在。那个#ifdef 总是去else。是的,我将 iOS 项目设置为默认值。有什么选择吗? 太复杂了

以上是关于如何知道当前执行代码的操作系统/平台(Android/iOS)的主要内容,如果未能解决你的问题,请参考以下文章

从原生 Android 主屏幕小部件调用 Flutter (Dart) 代码

Movilizer - 检索当前平台

Go-跨平台编译

如何编写跨平台C/C++代码的一些断想

Android平台GDB调试环境搭建

如何估计 ARM 平台上的程序消耗的能量? [关闭]