c# - 如何在 Monotouch 中获取 iOS 设备和版本

标签 c# ios xamarin.ios

如何确定正在使用我的应用程序的 iPhone、iPod、iPad 机型?我想获得如下输出:iPhone、iPhone 3G、iPhone 3GS 等

喜欢这个简单 objective-c 的答案:Answer to my question in Objective C

最佳答案

拿了这个example并将其更新为太平洋标准时间 3 月 24 日下午 3 点的当前 iOS 设备和模拟器列表。享受吧。

using System;
using System.Runtime.InteropServices;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace YourNamespace
{
public class IOSDeviceHardware
{
    public const string HardwareProperty = "hw.machine";

    public enum IOSHardware {
        iPhone,
        iPhone3G,
        iPhone3GS,
        iPhone4,
        iPhone4RevA,
        iPhone4CDMA,
        iPhone4S,
        iPhone5GSM,
        iPhone5CDMAGSM,
        iPodTouch1G,
        iPodTouch2G,
        iPodTouch3G,
        iPodTouch4G,
        iPodTouch5G,
        iPad,
        iPad3G,
        iPad2,
        iPad2GSM,
        iPad2CDMA,
        iPad2RevA,
        iPadMini,
        iPadMiniGSM,
        iPadMiniCDMAGSM,
        iPad3,
        iPad3CDMA,
        iPad3GSM,
        iPad4,
        iPad4GSM,
        iPad4CDMAGSM,
        iPhoneSimulator,
        iPhoneRetinaSimulator,
        iPadSimulator,
        iPadRetinaSimulator,
        Unknown
    }

    [DllImport(MonoTouch.Constants.SystemLibrary)]
    static internal extern int sysctlbyname([MarshalAs(UnmanagedType.LPStr)] string property, IntPtr output, IntPtr oldLen, IntPtr newp, uint newlen);

    public static IOSHardware Version {
        get {
            var pLen = Marshal.AllocHGlobal(sizeof(int));
            sysctlbyname(IOSDeviceHardware.HardwareProperty, IntPtr.Zero, pLen, IntPtr.Zero, 0);

            var length = Marshal.ReadInt32(pLen);

            if (length == 0) {
                Marshal.FreeHGlobal(pLen);

                return IOSHardware.Unknown;
            }

            var pStr = Marshal.AllocHGlobal(length);
            sysctlbyname(IOSDeviceHardware.HardwareProperty, pStr, pLen, IntPtr.Zero, 0);

            var hardwareStr = Marshal.PtrToStringAnsi(pStr);

            Marshal.FreeHGlobal(pLen);
            Marshal.FreeHGlobal(pStr);

            if (hardwareStr == "iPhone1,1") return IOSHardware.iPhone;
            if (hardwareStr == "iPhone1,2") return IOSHardware.iPhone3G;
            if (hardwareStr == "iPhone2,1") return IOSHardware.iPhone3GS;
            if (hardwareStr == "iPhone3,1") return IOSHardware.iPhone4;
            if (hardwareStr == "iPhone3,2") return IOSHardware.iPhone4RevA;
            if (hardwareStr == "iPhone3,3") return IOSHardware.iPhone4CDMA;
            if (hardwareStr == "iPhone4,1") return IOSHardware.iPhone4S;
            if (hardwareStr == "iPhone5,1") return IOSHardware.iPhone5GSM;
            if (hardwareStr == "iPhone5,2") return IOSHardware.iPhone5CDMAGSM;

            if (hardwareStr == "iPad1,1") return IOSHardware.iPad;
            if (hardwareStr == "iPad1,2") return IOSHardware.iPad3G;
            if (hardwareStr == "iPad2,1") return IOSHardware.iPad2;
            if (hardwareStr == "iPad2,2") return IOSHardware.iPad2GSM;
            if (hardwareStr == "iPad2,3") return IOSHardware.iPad2CDMA;
            if (hardwareStr == "iPad2,4") return IOSHardware.iPad2RevA;
            if (hardwareStr == "iPad2,5") return IOSHardware.iPadMini;
            if (hardwareStr == "iPad2,6") return IOSHardware.iPadMiniGSM;
            if (hardwareStr == "iPad2,7") return IOSHardware.iPadMiniCDMAGSM;
            if (hardwareStr == "iPad3,1") return IOSHardware.iPad3;
            if (hardwareStr == "iPad3,2") return IOSHardware.iPad3CDMA;
            if (hardwareStr == "iPad3,3") return IOSHardware.iPad3GSM;
            if (hardwareStr == "iPad3,4") return IOSHardware.iPad4;
            if (hardwareStr == "iPad3,5") return IOSHardware.iPad4GSM;
            if (hardwareStr == "iPad3,6") return IOSHardware.iPad4CDMAGSM;

            if (hardwareStr == "iPod1,1") return IOSHardware.iPodTouch1G;
            if (hardwareStr == "iPod2,1") return IOSHardware.iPodTouch2G;
            if (hardwareStr == "iPod3,1") return IOSHardware.iPodTouch3G;
            if (hardwareStr == "iPod4,1") return IOSHardware.iPodTouch4G;
            if (hardwareStr == "iPod5,1") return IOSHardware.iPodTouch5G;

            if (hardwareStr == "i386" || hardwareStr=="x86_64")
            {
                if (UIDevice.CurrentDevice.Model.Contains("iPhone"))
                {
                    if(UIScreen.MainScreen.Scale > 1.5f)
                        return IOSHardware.iPhoneRetinaSimulator;
                    else
                        return IOSHardware.iPhoneSimulator;
                }
                else
                {
                    if(UIScreen.MainScreen.Scale > 1.5f)
                        return IOSHardware.iPadRetinaSimulator;
                else
                    return IOSHardware.iPadSimulator;
                }
            }

            return IOSHardware.Unknown;
        }
    }
}
}

关于c# - 如何在 Monotouch 中获取 iOS 设备和版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10889695/

相关文章:

ios - 使用 Facebook 注册 Firebase,使用 Cloud Function 创建用户

c# - 线程函数的行为与我预期的不一样

ios - 从 iOS 应用程序将凭据传递到 Safari

c# - ASP.Net MVC 添加动态 EditorFor 元素

c# - mvc c# 中带有模型错误列表的一个属性

ios - 如何使用 swift 将字符串分成字节组

ios - 使用“performSelector”返回非id结果

c# - 使用 Database.SetInitializer 避免霰弹枪手术

c# - 构建表达式以过滤数据 EF Core

xamarin.ios - 是否可以将 xamarin 部分嵌入到现有的 native 应用程序中?