iOS Question Is there a way to read the device Model Number?

Turbo3

Active Member
Licensed User
Longtime User
Is there a way to read the device Model number? For example my iPhone SE would be a model MLMH2LL/A according to the General/About screen. I would like to add that information to the debug data my user's send back so I can better track problems.
 

Erel

B4X founder
Staff member
Licensed User
Longtime User
You cannot find the model number. You can get the device type with this code:
B4X:
Dim no As NativeObject = Me
Log(no.RunMethod("deviceName", Null).AsString)
End Sub

#if OBJC
#import <sys/utsname.h>
- (NSString*) deviceName
{
  struct utsname systemInfo;

  uname(&systemInfo);

  NSString* code = [NSString stringWithCString:systemInfo.machine
  encoding:NSUTF8StringEncoding];

  static NSDictionary* deviceNamesByCode = nil;

  if (!deviceNamesByCode) {

  deviceNamesByCode = @{@"i386"  :@"Simulator",
  @"x86_64"  :@"Simulator",
  @"iPod1,1"  :@"iPod Touch",  // (Original)
  @"iPod2,1"  :@"iPod Touch",  // (Second Generation)
  @"iPod3,1"  :@"iPod Touch",  // (Third Generation)
  @"iPod4,1"  :@"iPod Touch",  // (Fourth Generation)
  @"iPod7,1"  :@"iPod Touch",  // (6th Generation)  
  @"iPhone1,1" :@"iPhone",  // (Original)
  @"iPhone1,2" :@"iPhone",  // (3G)
  @"iPhone2,1" :@"iPhone",  // (3GS)
  @"iPad1,1"  :@"iPad",  // (Original)
  @"iPad2,1"  :@"iPad 2",  //
  @"iPad3,1"  :@"iPad",  // (3rd Generation)
  @"iPhone3,1" :@"iPhone 4",  // (GSM)
  @"iPhone3,3" :@"iPhone 4",  // (CDMA/Verizon/Sprint)
  @"iPhone4,1" :@"iPhone 4S",  //
  @"iPhone5,1" :@"iPhone 5",  // (model A1428, AT&T/Canada)
  @"iPhone5,2" :@"iPhone 5",  // (model A1429, everything else)
  @"iPad3,4"  :@"iPad",  // (4th Generation)
  @"iPad2,5"  :@"iPad Mini",  // (Original)
  @"iPhone5,3" :@"iPhone 5c",  // (model A1456, A1532 | GSM)
  @"iPhone5,4" :@"iPhone 5c",  // (model A1507, A1516, A1526 (China), A1529 | Global)
  @"iPhone6,1" :@"iPhone 5s",  // (model A1433, A1533 | GSM)
  @"iPhone6,2" :@"iPhone 5s",  // (model A1457, A1518, A1528 (China), A1530 | Global)
  @"iPhone7,1" :@"iPhone 6 Plus",  //
  @"iPhone7,2" :@"iPhone 6",  //
  @"iPhone8,1" :@"iPhone 6S",  //
  @"iPhone8,2" :@"iPhone 6S Plus",  //
  @"iPhone8,4" :@"iPhone SE",  //
  @"iPad4,1"  :@"iPad Air",  // 5th Generation iPad (iPad Air) - Wifi
  @"iPad4,2"  :@"iPad Air",  // 5th Generation iPad (iPad Air) - Cellular
  @"iPad4,4"  :@"iPad Mini",  // (2nd Generation iPad Mini - Wifi)
  @"iPad4,5"  :@"iPad Mini",  // (2nd Generation iPad Mini - Cellular)
  @"iPad4,7"  :@"iPad Mini",  // (3rd Generation iPad Mini - Wifi (model A1599))
  @"iPad6,7"  :@"iPad Pro (12.9\")", // iPad Pro 12.9 inches - (model A1584)
  @"iPad6,8"  :@"iPad Pro (12.9\")", // iPad Pro 12.9 inches - (model A1652)
  @"iPad6,3"  :@"iPad Pro (9.7\")",  // iPad Pro 9.7 inches - (model A1673)
  @"iPad6,4"  :@"iPad Pro (9.7\")"  // iPad Pro 9.7 inches - (models A1674 and A1675)
  };
  }

  NSString* deviceName = [deviceNamesByCode objectForKey:code];

  if (!deviceName) {
  // Not found on database. At least guess main device type from string contents:

  if ([code rangeOfString:@"iPod"].location != NSNotFound) {
  deviceName = @"iPod Touch";
  }
  else if([code rangeOfString:@"iPad"].location != NSNotFound) {
  deviceName = @"iPad";
  }
  else if([code rangeOfString:@"iPhone"].location != NSNotFound){
  deviceName = @"iPhone";
  }
  else {
  deviceName = @"Unknown";
  }
  }

  return deviceName;
}
#end if
Based on this answer: http://stackoverflow.com/questions/11197509/ios-how-to-get-device-make-and-model
 
Upvote 0

webhost.company

Active Member
Licensed User
Longtime User
You cannot find the model number. You can get the device type with this code:
B4X:
Dim no As NativeObject = Me
Log(no.RunMethod("deviceName", Null).AsString)
End Sub

#if OBJC
#import <sys/utsname.h>
- (NSString*) deviceName
{
  struct utsname systemInfo;

  uname(&systemInfo);

  NSString* code = [NSString stringWithCString:systemInfo.machine
  encoding:NSUTF8StringEncoding];

  static NSDictionary* deviceNamesByCode = nil;

  if (!deviceNamesByCode) {

  deviceNamesByCode = @{@"i386"  :@"Simulator",
  @"x86_64"  :@"Simulator",
  @"iPod1,1"  :@"iPod Touch",  // (Original)
  @"iPod2,1"  :@"iPod Touch",  // (Second Generation)
  @"iPod3,1"  :@"iPod Touch",  // (Third Generation)
  @"iPod4,1"  :@"iPod Touch",  // (Fourth Generation)
  @"iPod7,1"  :@"iPod Touch",  // (6th Generation) 
  @"iPhone1,1" :@"iPhone",  // (Original)
  @"iPhone1,2" :@"iPhone",  // (3G)
  @"iPhone2,1" :@"iPhone",  // (3GS)
  @"iPad1,1"  :@"iPad",  // (Original)
  @"iPad2,1"  :@"iPad 2",  //
  @"iPad3,1"  :@"iPad",  // (3rd Generation)
  @"iPhone3,1" :@"iPhone 4",  // (GSM)
  @"iPhone3,3" :@"iPhone 4",  // (CDMA/Verizon/Sprint)
  @"iPhone4,1" :@"iPhone 4S",  //
  @"iPhone5,1" :@"iPhone 5",  // (model A1428, AT&T/Canada)
  @"iPhone5,2" :@"iPhone 5",  // (model A1429, everything else)
  @"iPad3,4"  :@"iPad",  // (4th Generation)
  @"iPad2,5"  :@"iPad Mini",  // (Original)
  @"iPhone5,3" :@"iPhone 5c",  // (model A1456, A1532 | GSM)
  @"iPhone5,4" :@"iPhone 5c",  // (model A1507, A1516, A1526 (China), A1529 | Global)
  @"iPhone6,1" :@"iPhone 5s",  // (model A1433, A1533 | GSM)
  @"iPhone6,2" :@"iPhone 5s",  // (model A1457, A1518, A1528 (China), A1530 | Global)
  @"iPhone7,1" :@"iPhone 6 Plus",  //
  @"iPhone7,2" :@"iPhone 6",  //
  @"iPhone8,1" :@"iPhone 6S",  //
  @"iPhone8,2" :@"iPhone 6S Plus",  //
  @"iPhone8,4" :@"iPhone SE",  //
  @"iPad4,1"  :@"iPad Air",  // 5th Generation iPad (iPad Air) - Wifi
  @"iPad4,2"  :@"iPad Air",  // 5th Generation iPad (iPad Air) - Cellular
  @"iPad4,4"  :@"iPad Mini",  // (2nd Generation iPad Mini - Wifi)
  @"iPad4,5"  :@"iPad Mini",  // (2nd Generation iPad Mini - Cellular)
  @"iPad4,7"  :@"iPad Mini",  // (3rd Generation iPad Mini - Wifi (model A1599))
  @"iPad6,7"  :@"iPad Pro (12.9\")", // iPad Pro 12.9 inches - (model A1584)
  @"iPad6,8"  :@"iPad Pro (12.9\")", // iPad Pro 12.9 inches - (model A1652)
  @"iPad6,3"  :@"iPad Pro (9.7\")",  // iPad Pro 9.7 inches - (model A1673)
  @"iPad6,4"  :@"iPad Pro (9.7\")"  // iPad Pro 9.7 inches - (models A1674 and A1675)
  };
  }

  NSString* deviceName = [deviceNamesByCode objectForKey:code];

  if (!deviceName) {
  // Not found on database. At least guess main device type from string contents:

  if ([code rangeOfString:@"iPod"].location != NSNotFound) {
  deviceName = @"iPod Touch";
  }
  else if([code rangeOfString:@"iPad"].location != NSNotFound) {
  deviceName = @"iPad";
  }
  else if([code rangeOfString:@"iPhone"].location != NSNotFound){
  deviceName = @"iPhone";
  }
  else {
  deviceName = @"Unknown";
  }
  }

  return deviceName;
}
#end if
Based on this answer: http://stackoverflow.com/questions/11197509/ios-how-to-get-device-make-and-model
Your code is incomplete (has no iPhone 11 and other)
Can you add them?
I don't know how to add
Thanks
 
Upvote 0

Erel

B4X founder
Staff member
Licensed User
Longtime User
This code will return the device name:
B4X:
#If OBJC
#import <sys/utsname.h>
- (NSString*) deviceName
{
  struct utsname systemInfo;

  uname(&systemInfo);

  NSString* code = [NSString stringWithCString:systemInfo.machine
      encoding:NSUTF8StringEncoding];
  return code;
 }
 #end if

B4X:
Dim DeviceName As String = Me.As(NativeObject).RunMethod("deviceName", Null).AsString
 
Upvote 0
Top