如何快速判定iPhone机型是否晚于特定型号?适配Haptic振动需求
快速判定iPhone是否支持Haptic振动(无需适配新机型)
你完全不用每次新iPhone发布就更新APP!苹果官方非常推荐检测硬件功能支持,而非硬编码机型型号,这样就能一劳永逸,新机型出来自动兼容。
最优方案:直接检测Haptic反馈支持
既然你要使用Haptic振动效果,最直接的方式就是判断设备是否支持对应的触觉反馈能力,而不是纠结机型。iOS 10及以后提供了UIFeedbackGenerator相关类,我们可以利用它的isSupported属性来判断:
import UIKit func canUseHapticFeedback() -> Bool { // 先判断系统版本是否支持(iOS10及以上才有UIFeedbackGenerator) guard #available(iOS 10.0, *) else { return false } // 检查硬件是否支持触觉反馈(iPhone7及以后机型才会返回true) return UIImpactFeedbackGenerator().isSupported }
使用这个方法的好处:不管苹果以后发布多少新iPhone,只要设备硬件支持Haptic振动,这个函数就会自动返回true,你完全不用修改代码或提交更新。
不推荐的方案:硬编码机型判断
如果你非要通过机型型号来判断,虽然可行,但需要持续维护机型列表,每次新机型发布都得更新代码重新提交APP,非常麻烦。这里还是给你示例代码参考:
import Foundation func isIPhone7OrNewer() -> Bool { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) let deviceIdentifier = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } // 这里需要手动添加所有iPhone7及以后的设备型号 let supportedModels = [ "iPhone9,1", "iPhone9,2", // iPhone7 "iPhone9,3", "iPhone9,4", // iPhone7 Plus "iPhone10,1", "iPhone10,4", // iPhone8 "iPhone10,2", "iPhone10,5", // iPhone8 Plus "iPhone10,3", "iPhone10,6", // iPhoneX "iPhone11,2", // iPhoneXS "iPhone11,4", "iPhone11,6", // iPhoneXS Max "iPhone11,8", // iPhoneXR // ... 后续新机型都需要手动添加 ] return supportedModels.contains(deviceIdentifier) }
总结
强烈建议使用第一种功能检测的方式,这是苹果官方推崇的最佳实践,既能避免维护机型列表的麻烦,也能保证新机型发布后你的APP立刻兼容。
内容的提问来源于stack exchange,提问作者William Tong
相关产品推荐
相关产品推荐

