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