我想在 MonoTouch 中获得精确的设备型号(例如 iPad 3)。
我看过done in Objective C但我还没有找到正确的 P/Invokes。
最佳答案
我从几个地方取材并将其更改为我需要的,所以我不能完全相信它。有一个必须更新的枚举真的很糟糕,但是哦,好吧。
但这就是我所拥有的:
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
}
}
关于c# - 我如何知道 MonoTouch 中的 UIDevice 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14711015/