c# - 我如何知道 MonoTouch 中的 UIDevice 模型?

标签 c# ios xamarin.ios uidevice

我想在 MonoTouch 中获得精确的设备型号(例如 iPad 3)。
我看过done in Objective C但我还没有找到正确的 P/Invokes。

最佳答案

我从几个地方取材并将其更改为我需要的,所以我不能完全相信它。有一个必须更新的枚举真的很糟糕,但是哦,好吧。

但这就是我所拥有的:

public static class DeviceHelper
{
    public const string HardwareProperty = "hw.machine";
    public static readonly string PLATFORM;

    public static bool IsTall
    {
        get
        {
            return UIDevice.CurrentDevice.UserInterfaceIdiom
                == UIUserInterfaceIdiom.Phone
                    && UIScreen.MainScreen.Bounds.Height
                    * UIScreen.MainScreen.Scale >= 1136;
        }
    }

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

    static DeviceHelper ()
    {
        var pLen = Marshal.AllocHGlobal(sizeof(int));
        sysctlbyname(HardwareProperty, IntPtr.Zero, pLen, IntPtr.Zero, 0);

        var length = Marshal.ReadInt32(pLen);

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

        var hardwareStr = Marshal.PtrToStringAnsi(pStr);

        var ret = HardwareVersion.Unknown;

        if (hardwareStr == "iPhone1,1")
            ret = HardwareVersion.iPhone;
        else if (hardwareStr == "iPhone1,2")
            ret = HardwareVersion.iPhone3G;
        else if (hardwareStr == "iPhone2,1")
            ret = HardwareVersion.iPhone3GS;
        else if (hardwareStr == "iPhone3,1")
            ret = HardwareVersion.iPhone4;
        else if (hardwareStr == "iPhone3,3")
            ret = HardwareVersion.VerizoniPhone4;
        else if(hardwareStr == "iPhone4,1")
            ret = HardwareVersion.iPhone4S;
        else if(hardwareStr == "iPhone 5,1" || hardwareStr == "iPhone 5,2")
            ret = HardwareVersion.iPhone5;
        else if (hardwareStr == "iPad1,1")
            ret = HardwareVersion.iPad;
        else if (hardwareStr == "iPad2,1")
            ret = HardwareVersion.iPad2WIFI;
        else if (hardwareStr == "iPad2,2")
            ret = HardwareVersion.iPad2GSM;
        else if (hardwareStr == "iPad2,3")
            ret = HardwareVersion.iPad2CDMA;
        else if (hardwareStr == "iPad2,4")
            ret = HardwareVersion.iPad2WIFI24;
        else if (hardwareStr == "iPad3,1")
            ret = HardwareVersion.iPad3WIFI;
        else if (hardwareStr == "iPad3,2")
            ret = HardwareVersion.iPad3GSM;
        else if (hardwareStr == "iPad3,3")
            ret = HardwareVersion.iPad3CDMA;
        else if (hardwareStr == "iPod1,1")
            ret = HardwareVersion.iPod1G;
        else if (hardwareStr == "iPod2,1")
            ret = HardwareVersion.iPod2G;
        else if (hardwareStr == "iPod3,1")
            ret = HardwareVersion.iPod3G;
        else if (hardwareStr == "iPod4,1")
            ret = HardwareVersion.iPod4G;
        else if (hardwareStr == "i386" || hardwareStr=="x86_64") {
            if (UIDevice.CurrentDevice.Model.Contains("iPhone"))
                ret = UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale == 960 || UIScreen.MainScreen.Bounds.Width * UIScreen.MainScreen.Scale == 960 ? HardwareVersion.iPhone4Simulator : HardwareVersion.iPhoneSimulator;
            else
                ret = HardwareVersion.iPadSimulator;
        }

        if(ret == HardwareVersion.Unknown)
            PLATFORM = hardwareStr;
        else
            PLATFORM = ret.ToString();
    }

    public enum HardwareVersion {
        iPhone,
        iPhone3G,
        iPhone3GS,
        iPhone4,
        VerizoniPhone4,
        iPhone4S,
        iPhone5,
        iPod1G,
        iPod2G,
        iPod3G,
        iPod4G,
        iPad,
        iPad2WIFI,
        iPad2WIFI24,
        iPad2GSM,
        iPad2CDMA,
        iPad3WIFI,
        iPad3GSM,
        iPad3CDMA,
        iPhoneSimulator,
        iPhone4Simulator,
        iPadSimulator,
        Unknown
    }
}

关于c# - 我如何知道 MonoTouch 中的 UIDevice 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14711015/

相关文章:

c# - 在 C# 中,连续 3 个 '/' 是做什么的?

c# - Windows 7 任务栏图标高亮颜色

javascript - 无效日期 : Converting UTC to local

iphone - appdelegate 中的 clickedButtonAtIndex 未被调用

c# - 将字符串列表放入 NSUserDefaults 对象

c# - 等待线程池上的所有任务完成

iOS:关于 GLKMatrix4MakeLookAt 结果中的相机信息的问题

ios - 在使用 Xcode 9 为 iOS 11 设备构建的应用程序上出现间歇性和延迟的重要位置更改事件

ios - 关闭 ViewController 时如何在 Monotouch iOS 应用程序中删除观察者

json - 尝试在 Monotouch 上使用 ServiceStack 序列化自定义对象时出现 AOT 编译错误