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

5

我该如何确定我的应用程序正在使用哪种 iPhone、iPod 或 iPad 型号?我想要得到类似于:iPhone、iPhone 3G、iPhone 3GS 等输出结果。

像这个纯 Objective-C 的答案一样:Objective C 中的答案

3个回答

6

使用这个例子,并将其更新到截至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;
        }
    }
}
}

听起来不错,但是iPad2,4和iPad 2,1有什么区别呢? - Piotr Tomasik
我讨厌苹果没有使用'iPad4,1'来代替'iPad4'! - Felix K.
iPhone 6/6+怎么样? - Daniel Powell
@DanielPowell 我已经好几年没有使用Monotouch进行开发了。如果有人回答了,我会更新这个问题。 - Piotr Tomasik

2
在统一的API中,您需要更新dll导入。请按以下方式进行替换:
[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
    );

1
2013年3月24日更新的此代码的新版本:

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

我们该如何更新代码以考虑新的iPad Air和iPad Mini? - Goober

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接