Detecting hardware type (MonoTouch)
The MonoTouch wiki lists a snippet used to detect which hardware is being used at runtime – but it hasn’t been updated since iPhone 3G. This means no iPhone 3GS, iPhone 4 or iPad.
Code after the break; Kudos to the MonoTouch team!
UPDATE: Added iPhoneSimulator, iPhone4Simulator and iPadSimulator.
ANOTHER UPDATE: Fixed some identifiers. Sorry about that.
using System;
using System.Runtime.InteropServices;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
namespace YourNamespace {
public class DeviceHardware {
public const string HardwareProperty = "hw.machine";
public enum HardwareVersion {
iPhone,
iPhone3G,
iPhone3GS,
iPhone4,
iPod1G,
iPod2G,
iPod3G,
iPad,
iPhoneSimulator,
iPhone4Simulator,
iPadSimulator,
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 Version {
get {
var pLen = Marshal.AllocHGlobal(sizeof(int));
sysctlbyname(DeviceHardware.HardwareProperty, IntPtr.Zero, pLen, IntPtr.Zero, 0);
var length = Marshal.ReadInt32(pLen);
if (length == 0) {
Marshal.FreeHGlobal(pLen);
return HardwareVersion.Unknown;
}
var pStr = Marshal.AllocHGlobal(length);
sysctlbyname(DeviceHardware.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 == "iPad1,1")
ret = HardwareVersion.iPad;
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 == "i386") {
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;
}
Marshal.FreeHGlobal(pLen);
Marshal.FreeHGlobal(pStr);
return ret;
}
}
}
}
Hi,
There is something really weird and wrong there.
There never was iPhone “2G” and “1G”, first was original then 3G.
iPhone Original hardware model is iPhone1,1
iPhone 3G hardware model is iPhone1,2
iPhone 3GS hardware model is iPhone2,1
iPhone 4 hardware model is iPhone3,1
You can see http://www.iclarified.com/entry/index.php?enid=750 that contains links to official Apple software updates.