自从Mac推出自研m1芯片以后,打通了Mac和iPhone之间隔阂,自此iOS应用可以直接在Mac上运行。Mac运行iOS应用时,会将自身模拟成iPad,即Mac(Designed for iPad)。这给用户数据统计回收带来了一个新的问题,如何区分真假iPad。
通过ProcessInfo ⭐️最佳实践⭐️
var isiOSAppOnMac = false
if #available(iOS 14.0, *) {
isiOSAppOnMac = ProcessInfo.processInfo.isiOSAppOnMac
}
print(isiOSAppOnMac)
通过UIDevice
Mac | iPad | |
---|---|---|
name | Archie’s MacBook Pro | Archie’s iPad |
systemName | iPadOS | iPadOS |
systemVersion | 15.5 | 15.6 |
model | iPad | iPad |
localizedModel | iPad | iPad |
userInterfaceIdiom | 1 | 1 |
identifierForVendor | 808B54EF-1948-5CC1-ABF6-4DE4435EAD87 | 90F5F4F1-1E11-4CE6-BFF3-8284B696C3D8 |
由上可以看出,除了设备名称以外,其他属性两者完全一致。可以通过设备名称做模糊的区分,如果用户使用默认名称的话。
通过Bundle
print(Bundle.main.bundlePath)
Mac | iPad | |
---|---|---|
bundlePath | /private/var/folders/9y/qv19x3g51cjcq5j8txcv9jzw0000gn/X/B0D7A504-D458-5C41-8436-715656E12816/d/Wrapper/ApplicationName.app | /private/var/containers/Bundle/Application/9BCE001F-2378-425E-988D-8A11D2905315/ApplicationName.app |
通过utsname
/*
struct utsname {
var sysname
var nodename
var release
var version
var machine
}
*/
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
print(identifier)
Mac | iPad | |
---|---|---|
sysname | Darwin | Darwin |
nodename | Archies-MacBook-Pro.local | Archies-iPad |
release | 21.5.0 | 21.6.0 |
version | Darwin Kernel Version 21.5.0: Tue Apr 26 21:08:29 PDT 2022; root:xnu-8020.121.3~4/RELEASE_ARM64_T8101 | Darwin Kernel Version 21.6.0: Sat Jun 18 18:56:14 PDT 2022; root:xnu-8020.140.41~4/RELEASE_ARM64_T8101 |
machine | iPad8,6 | iPad13,16 |
这里nodename里Mac会多一个.local。
machine对照表:iPhone/iPad苹果设备型号对应常用名称列表
参考: how-to-detect-if-an-ios-app-is-running-on-an-m1-mac