在Monotouch中发现iPad一代

在Monotouch中发现iPad一代,ipad,xamarin.ios,Ipad,Xamarin.ios,在设置openGl曲面之前,我需要确定我的应用程序运行的iPad版本 如果它在旧的iPad1上运行,那么启用抗锯齿的速度太慢,而在iPad2+3上应该没有性能问题,所以我需要先检测一下 有没有关于如何使用Monotouch检测iPad版本的想法?您可以使用p/Invoke tosysctlbyname找到硬件版本 不过它有点复杂,所以我建议您使用可用的代码,并使用iPad2(iPad2,1)和更高版本扩展它。也许还可以用您的更改更新wiki:)谢谢Joachim,您的提示让我找到了以下解决方案,

在设置openGl曲面之前,我需要确定我的应用程序运行的iPad版本

如果它在旧的iPad1上运行,那么启用抗锯齿的速度太慢,而在iPad2+3上应该没有性能问题,所以我需要先检测一下


有没有关于如何使用Monotouch检测iPad版本的想法?

您可以使用p/Invoke to
sysctlbyname
找到硬件版本


不过它有点复杂,所以我建议您使用可用的代码,并使用iPad2(iPad2,1)和更高版本扩展它。也许还可以用您的更改更新wiki:)

谢谢Joachim,您的提示让我找到了以下解决方案,我已经在物理1-3代iPad上测试过,它还应该能够检测到其他苹果设备:

public enum HardwareVersion
{
        iPhone2G,
        iPhone3G,
        iPhone3Gs,
        iPhone4,
        iPod1G,
        iPod2G,
        iPod3G,
        Simulator,
        iPad1G,
        iPad2G,
        iPad3G,
        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 HardwareVersion getHardwareVersion()
    {
        string HardwareProperty = "hw.machine";

        // get the length of the string that will be returned
        var pLen = Marshal.AllocHGlobal (sizeof(int));
        sysctlbyname (HardwareProperty, IntPtr.Zero, pLen, IntPtr.Zero, 0);

        var length = Marshal.ReadInt32 (pLen);

        // check to see if we got a length
        if (length == 0) {
                Marshal.FreeHGlobal (pLen);
                return HardwareVersion.Unknown;
        }

        // get the hardware string
        var pStr = Marshal.AllocHGlobal (length);
        sysctlbyname (HardwareProperty, pStr, pLen, IntPtr.Zero, 0);

        // convert the native string into a C# string
        var hardwareStr = Marshal.PtrToStringAnsi (pStr);
        var ret = HardwareVersion.Unknown;

        // determine which hardware we are running
        if (hardwareStr == "iPhone1,1")
                ret = HardwareVersion.iPhone2G; 
        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 == "iPod1,1")
                ret = HardwareVersion.iPod1G; 
        else if (hardwareStr == "iPod2,1")
                ret = HardwareVersion.iPod2G; 
        else if (hardwareStr == "iPod3,1")
                ret = HardwareVersion.iPod3G; 
        else if (hardwareStr == "iPad1,1")
                ret = HardwareVersion.iPad1G; 
        else if (hardwareStr == "iPad2,1")
                ret = HardwareVersion.iPad2G; 
        else if (hardwareStr == "iPad3,1")
                ret = HardwareVersion.iPad3G; 
        else if (hardwareStr == "i386" || hardwareStr == "x86_64"  || hardwareStr == "x86_32" )
                ret = HardwareVersion.Simulator;

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

        return ret;
}