How do I get the iOS Device and Version in Monotou

2020-06-20 02:23发布

问题:

How can I determine what iPhone, iPod, iPad Model is using my application? I would like to get output like: iPhone, iPhone 3G, iPhone 3GS etc

Like this answer for plain objective C: Answer to my question in Objective C

回答1:

Took this example and updated it to the current list of iOS Devices and Simulators as of March 24th 3PM PST. Enjoy.

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


回答2:

In the unified api you have to update the dll import.

Replace it as following:

[DllImport ("libc", CallingConvention = CallingConvention.Cdecl)]
internal static extern int sysctlbyname([MarshalAs(UnmanagedType.LPStr)] string property, // name of the property
                                            IntPtr output, // output
                                            IntPtr oldLen, // IntPtr.Zero
                                            IntPtr newp, // IntPtr.Zero
                                            uint newlen // 0
    );


回答3:

New version of this code as of March 24th, 2013:

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