[FMX] 获取 iOS 设备的类型名称

[更新]

2016.10.10

  • 增加 iPad 和 iPod 的几款新型设备

2016.9.30

  • 修改了 GetDeviceModel 函数,由 sysctl 改成使用 uname(Delphi 没有声明,需要声明下)
  • 增加对 iPhone 7 的设备型号列表

好吧,我承认这个函数不是必需的,只是为了满足我无耻的偷窥欲。所以,我在 FMX 标准的 IDeviceInfo 接口之外,额外想知道用的户的手机到底是 iPhone 或 iPad 的型号,而 FMX 没有提供满足我好奇心的东西,所以自己在搜索资料之余,简单写了一下,分享给大家。

第一步:大家需要包含一下 Posix.Base 和 System.NetEncoding 、QString(在 QDAC 源码中)。

第二步:将下面的代码复制到你的程序中:

uses QString,Posix.Base,System.NetEncoding;

type
  utsname = packed record
    sysname: array [0 .. 255] of Byte;
    nodename: array [0 .. 255] of Byte;
    release: array [0 .. 255] of Byte;
    version: array [0 .. 255] of Byte;
    machine: array [0 .. 255] of Byte;
    domainname: array [0 .. 255] of Byte;
  end;

function uname(var name: utsname): Integer; cdecl;
  external libc name _PU + 'uname';

function GetDeviceModel: String;
var
  AName: utsname;
begin
  FillChar(AName, sizeof(AName), 0);
  if uname(AName) = 0 then
    Result := AnsiDecode(@AName.machine[0])
  else
    Result := '<UNKNOWN_IOS_DEVICE>';
end;

function GetIOSDeviceName: String;
const
  ModelNames: array [0 .. 145] of String = (
    // iPhone
    'iPhone1,1', 'iPhone 2G', 'iPhone1,2', 'iPhone 3G', 'iPhone2,1',
    'iPhone 3GS', 'iPhone3,1', 'iPhone 4', 'iPhone3,2', 'iPhone 4', 'iPhone3,3',
    'iPhone 4', 'iPhone4,1', 'iPhone 4S', 'iPhone5,1', 'iPhone 5', 'iPhone5,2',
    'iPhone 5', 'iPhone5,3', 'iPhone 5C', 'iPhone5,4', 'iPhone 5C', 'iPhone6,1',
    'iPhone 5S', 'iPhone6,2', 'iPhone 5S', 'iPhone7,1', 'iPhone 6 Plus',
    'iPhone7,2', 'iPhone 6', 'iPhone8,1', 'iPhone 6s', 'iPhone8,2',
    'iPhone 6s Plus', 'iPhone8,4', 'iPhone SE', 'iPhone9,1', 'iPhone 7',
    'iPhone9,3', 'iPhone7', 'iPhone9,2', 'iPhone7 Plus', 'iPhone9,4',
    'iPhone 7 Plus','iPhone10,1','iPhone 8','iPhone10,4','iPhone 8',
    'iPhone10,2','iPhone 8 Plus','iPhone10,5','iPhone 8 Plus','iPhone10,3',
    'iPhone X','iPhone10,6','iPhone X',
    // iPod
    'iPod1,1', 'iPod Touch 1G', 'iPod2,1', 'iPod Touch 2G', 'iPod3,1',
    'iPod Touch 3G', 'iPod4,1', 'iPod Touch 4G', 'iPod5,1', 'iPod Touch 5G',
    'iPod7,1', 'iPod Touch 6G',
    // iPad
    'iPad1,1', 'iPad', 'iPad2,1', 'iPad 2', 'iPad2,2', 'iPad 2', 'iPad2,3',
    'iPad 2', 'iPad2,4', 'iPad 2', 'iPad2,5', 'iPad Mini 1G', 'iPad2,6',
    'iPad Mini 1G', 'iPad2,7', 'iPad Mini 1G', 'iPad3,1', 'iPad 3', 'iPad3,2',
    'iPad 3', 'iPad3,3', 'iPad 3', 'iPad3,4', 'iPad 4', 'iPad3,5', 'iPad 4',
    'iPad3,6', 'iPad 4', 'iPad4,1', 'iPad Air', 'iPad4,2', 'iPad Air',
    'iPad4,3', 'iPad Air', 'iPad4,4', 'iPad Mini 2G', 'iPad4,5', 'iPad Mini 2G',
    'iPad4,6', 'iPad Mini 2G', 'iPad4,7', 'iPad Mini 3', 'iPad4,8',
    'iPad Mini 3', 'iPad4,9', 'iPad Mini 3', 'iPad5,1', 'iPad Mini 4',
    'iPad5,2', 'iPad Mini 4', 'iPad5,3', 'iPad Air 2', 'iPad5,4', 'iPad Air 2',
    'iPad6,7', 'iPad Pro', 'iPad6,8', 'iPad Pro', 'iPad6,3', 'iPad Pro',
    'iPad6,4', 'iPad Pro', 'iPad6,11','iPad','iPad6,12','iPad','iPad7,1','iPad Pro',
    'iPad7,2', 'iPad Pro', 'iPad7,3','iPad Pro','iPad7,4','iPad Pro'
    //Simulator
    'i386', 'Simulator', 'x86_64', 'Simulator');
var
  I: Integer;
begin
  Result := GetDeviceModel;
  I := 0;
  while I < Length(ModelNames) do
  begin
    if Result = ModelNames[I] then
    begin
      Result := ModelNames[I+1];
      Break;
    end;
    Inc(I, 2);
  end;
end;

第三步:调用上面的 GetDeviceModel 可以获取到设备的型号标志字符串,用GetIOSDeviceName 就可以获取到具体的设备型号名称( 如 iPhone 5 )了。

关于设备 Id 和设备名称之间的映射关系,最新数据可以参考这里,然后按格式添加到数组里就可以了。

 

分享到: