Search code examples
c#iosxamarin.iosuidevice

How do I know UIDevice model in MonoTouch?


I'd like to get precise device model (e.g. iPad 3) in MonoTouch.
I've seen it done in Objective C but I haven't figured out the correct P/Invokes yet.


Solution

  • I took this from a few places and changed it to what I needed, so I can't take full credit for it. It really stinks to have an enum that has to be updated, but oh well.

    But this is what I have:

    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
        }
    }