How to get device make and model on iOS?
28th
August 2022
For anyone not wanting to use Swift’s
Mirror
, here’s a solution using normal types (with support for simulators too):#if targetEnvironment(simulator) @objc public protocol UIDevicePrivate { @objc func _deviceInfoForKey(_:String) -> Any? } #endif extension UIDevice { var hardwareModel: String { #if targetEnvironment(simulator) let privateSelf = unsafeBitCast(self, to:UIDevicePrivate.self) if let model = privateSelf._deviceInfoForKey("HWModelStr") as? String { return model + " (Simulator)" } #endif var systemInfo = utsname() uname(&systemInfo) return String(characters: systemInfo.machine) } } typealias StaticArray256<Element> = (Element, Element, Element,Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element, Element) // This function is necessary because Swift really doesn't like creating a 256 element long static array func enumerate<T>(tuple: StaticArray256<T>, body: (Int, T) -> Void) { body(0, tuple.0) body(1, tuple.1) body(2, tuple.2) body(3, tuple.3) body(4, tuple.4) body(5, tuple.5) body(6, tuple.6) body(7, tuple.7) body(8, tuple.8) body(9, tuple.9) body(10, tuple.10) body(11, tuple.11) body(12, tuple.12) body(13, tuple.13) body(14, tuple.14) body(15, tuple.15) body(16, tuple.16) body(17, tuple.17) body(18, tuple.18) body(19, tuple.19) body(20, tuple.20) body(21, tuple.21) body(22, tuple.22) body(23, tuple.23) body(24, tuple.24) body(25, tuple.25) body(26, tuple.26) body(27, tuple.27) body(28, tuple.28) body(29, tuple.29) body(30, tuple.30) body(31, tuple.31) body(32, tuple.32) body(33, tuple.33) body(34, tuple.34) body(35, tuple.35) body(36, tuple.36) body(37, tuple.37) body(38, tuple.38) body(39, tuple.39) body(40, tuple.40) body(41, tuple.41) body(42, tuple.42) body(43, tuple.43) body(44, tuple.44) body(45, tuple.45) body(46, tuple.46) body(47, tuple.47) body(48, tuple.48) body(49, tuple.49) body(50, tuple.50) body(51, tuple.51) body(52, tuple.52) body(53, tuple.53) body(54, tuple.54) body(55, tuple.55) body(56, tuple.56) body(57, tuple.57) body(58, tuple.58) body(59, tuple.59) body(60, tuple.60) body(61, tuple.61) body(62, tuple.62) body(63, tuple.63) body(64, tuple.64) body(65, tuple.65) body(66, tuple.66) body(67, tuple.67) body(68, tuple.68) body(69, tuple.69) body(70, tuple.70) body(71, tuple.71) body(72, tuple.72) body(73, tuple.73) body(74, tuple.74) body(75, tuple.75) body(76, tuple.76) body(77, tuple.77) body(78, tuple.78) body(79, tuple.79) body(80, tuple.80) body(81, tuple.81) body(82, tuple.82) body(83, tuple.83) body(84, tuple.84) body(85, tuple.85) body(86, tuple.86) body(87, tuple.87) body(88, tuple.88) body(89, tuple.89) body(90, tuple.90) body(91, tuple.91) body(92, tuple.92) body(93, tuple.93) body(94, tuple.94) body(95, tuple.95) body(96, tuple.96) body(97, tuple.97) body(98, tuple.98) body(99, tuple.99) body(100, tuple.100) body(101, tuple.101) body(102, tuple.102) body(103, tuple.103) body(104, tuple.104) body(105, tuple.105) body(106, tuple.106) body(107, tuple.107) body(108, tuple.108) body(109, tuple.109) body(110, tuple.110) body(111, tuple.111) body(112, tuple.112) body(113, tuple.113) body(114, tuple.114) body(115, tuple.115) body(116, tuple.116) body(117, tuple.117) body(118, tuple.118) body(119, tuple.119) body(120, tuple.120) body(121, tuple.121) body(122, tuple.122) body(123, tuple.123) body(124, tuple.124) body(125, tuple.125) body(126, tuple.126) body(127, tuple.127) body(128, tuple.128) body(129, tuple.129) body(130, tuple.130) body(131, tuple.131) body(132, tuple.132) body(133, tuple.133) body(134, tuple.134) body(135, tuple.135) body(136, tuple.136) body(137, tuple.137) body(138, tuple.138) body(139, tuple.139) body(140, tuple.140) body(141, tuple.141) body(142, tuple.142) body(143, tuple.143) body(144, tuple.144) body(145, tuple.145) body(146, tuple.146) body(147, tuple.147) body(148, tuple.148) body(149, tuple.149) body(150, tuple.150) body(151, tuple.151) body(152, tuple.152) body(153, tuple.153) body(154, tuple.154) body(155, tuple.155) body(156, tuple.156) body(157, tuple.157) body(158, tuple.158) body(159, tuple.159) body(160, tuple.160) body(161, tuple.161) body(162, tuple.162) body(163, tuple.163) body(164, tuple.164) body(165, tuple.165) body(166, tuple.166) body(167, tuple.167) body(168, tuple.168) body(169, tuple.169) body(170, tuple.170) body(171, tuple.171) body(172, tuple.172) body(173, tuple.173) body(174, tuple.174) body(175, tuple.175) body(176, tuple.176) body(177, tuple.177) body(178, tuple.178) body(179, tuple.179) body(180, tuple.180) body(181, tuple.181) body(182, tuple.182) body(183, tuple.183) body(184, tuple.184) body(185, tuple.185) body(186, tuple.186) body(187, tuple.187) body(188, tuple.188) body(189, tuple.189) body(190, tuple.190) body(191, tuple.191) body(192, tuple.192) body(193, tuple.193) body(194, tuple.194) body(195, tuple.195) body(196, tuple.196) body(197, tuple.197) body(198, tuple.198) body(199, tuple.199) body(200, tuple.200) body(201, tuple.201) body(202, tuple.202) body(203, tuple.203) body(204, tuple.204) body(205, tuple.205) body(206, tuple.206) body(207, tuple.207) body(208, tuple.208) body(209, tuple.209) body(210, tuple.210) body(211, tuple.211) body(212, tuple.212) body(213, tuple.213) body(214, tuple.214) body(215, tuple.215) body(216, tuple.216) body(217, tuple.217) body(218, tuple.218) body(219, tuple.219) body(220, tuple.220) body(221, tuple.221) body(222, tuple.222) body(223, tuple.223) body(224, tuple.224) body(225, tuple.225) body(226, tuple.226) body(227, tuple.227) body(228, tuple.228) body(229, tuple.229) body(230, tuple.230) body(231, tuple.231) body(232, tuple.232) body(233, tuple.233) body(234, tuple.234) body(235, tuple.235) body(236, tuple.236) body(237, tuple.237) body(238, tuple.238) body(239, tuple.239) body(240, tuple.240) body(241, tuple.241) body(242, tuple.242) body(243, tuple.243) body(244, tuple.244) body(245, tuple.245) body(246, tuple.246) body(247, tuple.247) body(248, tuple.248) body(249, tuple.249) body(250, tuple.250) body(251, tuple.251) body(252, tuple.252) body(253, tuple.253) body(254, tuple.254) body(255, tuple.255) } extension Array { init(staticArray: StaticArray256<Element>) { var array = [Element]() enumerate(tuple: staticArray) { array.append($1) } self = array } } extension String { init(characters: StaticArray256<CChar>) { self.init(String.UnicodeScalarView(Array(staticArray: characters).compactMap(Int.init).filter({ $0 > 0 }).compactMap(UnicodeScalar.init))) } }