Get iOS device model

How to get the mode type like this?
@“iPhone13,4” on iPhone 12 Pro Max

See:
StackOverflow

With this code, I got only iPad or iPhone:

declare function NSClassFromString lib "Foundation" (clsName as cfstringref) as ptr
declare function currentDevice lib "UIKit" selector "currentDevice" (clsRef as ptr) as ptr
dim currentDeviceRef as ptr = currentDevice(NSClassFromString("UIDevice"))

declare function model lib "UIKit" selector "model" (classRef as Ptr) as CFStringRef

dim t as text
dim c as CFStringRef 
c = model(currentDeviceRef)
t = c
if DebugBuild then
  system.DebugLog "NEW DetectHW: " + t
end if
return t

I have try to get the model name, but the result is nothing:

declare function NSClassFromString lib "Foundation" (clsName as cfstringref) as ptr
declare function currentDevice lib "UIKit" selector "currentDevice" (clsRef as ptr) as ptr
dim currentDeviceRef as ptr = currentDevice(NSClassFromString("UIKit.**modelName**"))

declare function model lib "UIKit" selector "**modelname**" (classRef as Ptr) as CFStringRef

dim t as text
dim c as CFStringRef 
c = model(currentDeviceRef)
t = c
if DebugBuild then
  system.DebugLog "NEW DetectHW: " + t
end if
return t

Welcome to the forums !

FWIW there are formatting tags you can insert to highlight your code
EDIT : I INSERTED THESE TAGS INTO YOUR POST TO MAKE IT MODE READABLE

UIDevice certainly seems like the right one
Are you just not getting a result or is it not returning the result you expect ?

Other answers to this look like this one on GitHub

They get the model identifier and manually turn that into a specific device name

If I use the original declare in Xojo, the return value is “iPad” or “iPhone”, but not “iPhone8,2” or something else. What must be change in the declare definition?

Have you tried B4i?

You dont need Declares there, just acces the native objects directly in code:

Dim device As NativeObject
device = device.Initialize("UIDevice").RunMethod("currentDevice", null)
Log(device.GetField("name").AsString)
Log(device.GetField("model").AsString)
Log(device.GetField("systemName").AsString)

I dont see that any of the items in UIDevice gives you that identifier
Probably why others resort to using uname and manual lookup

try this
NOTE that on a simulator you will get x86_64 or something else (like ARM if you are running a simulator on an M1 based machine)
But on a real phone it should give you the right string

If you put a breakpoint in this code you can see each value you get from the UIDevice calls

Declare Function NSClassFromString Lib "Foundation" (clsName As cfstringref) As ptr
Declare Function currentDevice Lib "UIKit" selector "currentDevice" (clsRef As ptr) As ptr
Dim currentDeviceRef As ptr = currentDevice(NSClassFromString("UIDevice"))

Declare Function name Lib "UIKit" selector "name" (classRef As Ptr) As CFStringRef
Declare Function systemName Lib "UIKit" selector "systemName" (classRef As Ptr) As CFStringRef
Declare Function model Lib "UIKit" selector "model" (classRef As Ptr) As CFStringRef
Declare Function localizedModel Lib "UIKit" selector "localizedModel" (classRef As Ptr) As CFStringRef

Declare Function uname Lib "Foundation" (ByRef dataPtr As systemInfo) As Integer

Dim info As systemInfo

Dim t As Text
Dim c As CFStringRef 
c = name(currentDeviceRef)
t = c
c = systemName(currentDeviceRef)
t = c
c = model(currentDeviceRef)
t = c
c = localizedModel(currentDeviceRef)
t = c

Dim result As Integer = uname(info)
If result = 0 Then
  dim s as string = info.machine
  t = s.ToText
End If

If DebugBuild Then
  System.DebugLog "NEW DetectHW: " + t
End If
Return t

I got these errors:

Module1.DetectHW, line 10
Can’t find a type with this name
Declare Function uname Lib “Foundation” (ByRef dataPtr As systemInfo) As Integer

Module1.DetectHW, line 12
Can’t find a type with this name
Dim info As systemInfo

oh sorry thats a structure in Xojo
its defined as

structure systemInfo
    sysname as string*256
    nodename as  string*256
    release as string*256
    version as string*256
   machine as  string*256
end structure

you’ll need to add this to your project somewhere (you can add it to a window, class module etc as long as its scope is global)

here’s a sample

Thank you, now it works perfect. Here is the code to compare ModelItentifier to product name:

select case t
// iPhone
case "iPhone1,1"
  return "iPhone"
 
case "iPhone1,2"
  return "iPhone 3G"

case "iPhone2,1"
  return "iPhone 3GS"

case "iPhone3,1", "iPhone3,2"
  return "iPhone 4 (GSM)"
  
case "iPhone3,3"
  return "iPhone 4 (GSM)"
  
case "iPhone4,1"
  return "iPhone 4s"

case "iPhone5,1"
  return "iPhone 5 (GSM)"

case "iPhone5,2"
 return "iPhone 5 China"

case "iPhone5,3", "iPhone5,4"
  return "iPhone 5c"

case "iPhone6,1"
  return "iPhone 5s"

case "iPhone7,2"
  return "iPhone 6"
 
case "iPhone7,1"
  return "iPhone 6 Plus"

case "iPhone8,1"
  return "iPhone 6s"

case "iPhone8,2"
  return "iPhone 6s Plus"

case "iPhone8,4"
  return "iPhone SE"

case "iPhone9,1", "iPhone9,3"
  return "iPhone 7"

case "iPhone9,2", "iPhone9,4"
  return "iPhone 7 Plus"

case "iPhone10,1", "iPhone10,4"
  return "iPhone 8"

case "iPhone10,2", "iPhone10,5"
  return "iPhone 8 Plus"

case "iPhone10,3", "iPhone10,6"
  return "iPhone X"

case "iPhone11,2"
  return "iPhone XS"

case "iPhone11,6"
  return "iPhone XS Max"

case "iPhone11,3"
  return "iPhone XR"

case "iPhone12,1"
  return "iPhone 11"
  
case "iPhone12,3"
  return "iPhone 11 Pro"

case "iPhone12,5"
  return "iPhone 11 Pro Max"

case "iPhone12,8"
  return "iPhone SE 2nd Generation"

case "iPhone13,2"
  return "iPhone 12"

case "iPhone13,3"
  return "iPhone 12 Pro"

case "iPhone13,1"
  return "iPhone 12 Mini"

case "iPhone13,4"
   return "iPhone 12 Pro Max"
  
  
 // iPod

case "iPod1,1"
  return "iPod Touch"

case "iPod2,1"
  return "iPod Touch 2nd Generation"

case "iPod3,1"
  return "iPod Touch 3rd Generation"

case "iPod4,1"
  return "iPod Touch 4th Generation"

case "iPod5,1"
  return "iPod Touch 5th Generation"

case "iPod7,1"
  return "iPod Touch 6th Generation"

case "iPod9,1"
  return "iPod Touch 7th Generation"


  // iPad
case "iPad1,1"
  return "iPad"

case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4"
  return "iPad 2"

case "iPad3,1", "iPad3,2", "iPad3,3"
  return "iPad 3rd Generation"

case "iPad3,4", "iPad3,5", "iPad3,6"
  return "iPad 4th Generation"

case "iPad2,5", "iPad2,5", "iPad2,7"
  return "iPad Mini"

case "iPad4,1", "iPad4,2"
  return "iPad Air"

case "iPad4,4", "iPad4,5"
  return "iPad Mini 2nd Generation"

case "iPad5,3", "iPad5,4"
  return "iPad Air 2"

case "iPad4,7", "iPad4,8"
  return "iPad Mini 3rd Generation"

case "iPad5,1", "iPad5,2"
  return "iPad Mini 4th Generation"

case "iPad6,7", "iPad6,8"
  return "iPad Pro 12.9"""

case "iPad6,3", "iPad6,4"
  return "iPad Pro 9.7"""

    case "iPad6,11", "iPad6,12"
  return "iPad 5th Generation"

case "iPad7,3", "iPad7,4"
  return "iPad Pro 10.5"""

case "iPad7,1", "iPad7,2"
  return "iPad Pro 12.9"" 2nd Generation"

case "iPad7,5", "iPad7,6"
  return "iPad 6th Generation"

case "iPad8,1", "iPad8,3"
  return "iPad Pro 11"""

case "iPad8,5", "iPad8,7"
  return "iPad Pro 12.9"" 3nd Generation"

case "iPad11,3", "iPad11,4"
  return "iPad Air 3nd Generation"

case "iPad11,1", "iPad11,2"
  return "iPad Mini 5th Generation"

case "iPad7,11", "iPad7,12"
  return "iPad 7th Generation"

case "iPad8,9", "iPad8,10"
  return "iPad Pro 11"" 2nd Generation"

case "iPad8,11", "iPad8,12"
  return "iPad Pro 12.9"" 4th Generation"

case "iPad11,6", "iPad11,7"
  return "iPad 8th Generation"

case "iPad13,1", "iPad13,2"
  return "iPad Air 4th Generation"

case "x86_64"
  return "Xcode Simulator"

else
  return "Unknown Device"
  
end select

If DebugBuild Then
  System.DebugLog "NEW DetectHW: " + t
End If
1 Like

You realize a few flaws here.

  1. you need to manually update this as new models come out (something I do with my GUI writer)
  2. anything prior to iPhone6s isn’t compatible with iOS14

For my code (Swift not Xojo), I don’t care about the device “name”, but go based solely on screen resoltuion (thus putting things into “family” of devices, since as of now there are only 13 different resolutions (vs your 63 individual devices)

But it does depend on your need I guess… for me I just use this data for screen layout since I don’t use Autolayout