编写单元测试时,如何判断iPhone 5及后续机型以验证ApplePay支持?
解决Apple Pay硬件支持测试的机型判断问题
嘿,我来帮你搞定这个测试用例的问题!首先先给你提个小建议:其实你现有的isHardwareSuportedForApplePay()方法调用的PKPaymentAuthorizationViewController.canMakePayments()已经是苹果官方提供的判断硬件支持的API,它会自动识别设备是否符合Apple Pay的硬件要求(包括iPhone 5及后续机型,还有部分iPad、Apple Watch等设备),所以测试时其实可以直接验证这个方法的返回值是否符合对应设备的预期,而不用手动判断机型。不过如果你确实需要在测试里手动判断iPhone 5及以后的机型,下面是具体的实现方案:
1. 获取设备的型号标识符
要判断机型,我们需要先获取设备的型号标识符(比如iPhone5,1对应iPhone 5,iPhone14,3对应iPhone 13 Pro等),可以通过sysctlbyname来获取:
import Foundation func deviceModelIdentifier() -> String { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) return machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } }
2. 判断是否为iPhone 5及后续机型
接下来,我们可以创建一个辅助方法,对比型号标识符来判断是否是iPhone 5及以后的设备:
func isIPhone5OrLater() -> Bool { let model = deviceModelIdentifier() // iPhone 5的型号标识符是iPhone5,1和iPhone5,2,后续机型的标识符都是iPhoneX,X格式且X >=5 let iphone5Models = ["iPhone5,1", "iPhone5,2"] if iphone5Models.contains(model) { return true } // 匹配后续的iPhone型号(比如iPhone6,1、iPhone14,8等) if model.starts(with: "iPhone") { let parts = model.components(separatedBy: ",") guard let majorVersion = parts.first?.replacingOccurrences(of: "iPhone", with: ""), let version = Int(majorVersion) else { return false } return version >= 5 } return false }
3. 编写测试用例
现在你可以在XCTest测试类里,结合上面的方法来编写测试用例:
import XCTest import PassKit class ApplePayTests: XCTestCase { func testIsHardwareSupportedForApplePay() { let isSupported = YourClassName.isHardwareSuportedForApplePay() let isIPhone5OrLater = isIPhone5OrLater() // 如果是iPhone5及后续机型,预期返回true;否则返回false if isIPhone5OrLater { XCTAssertTrue(isSupported, "iPhone 5及后续机型应该支持Apple Pay硬件") } else { XCTAssertFalse(isSupported, "非iPhone5及后续机型不支持Apple Pay硬件") } } }
注意事项
- 苹果官方不推荐手动判断机型,因为未来发布的新机型可能会改变型号命名规则,而
PKPaymentAuthorizationViewController.canMakePayments()会自动适配这些变化,所以优先依赖官方API来判断支持性会更可靠。 - 除了iPhone,Apple Pay还支持部分iPad和Apple Watch设备,如果你的测试需要覆盖这些设备,可能需要扩展上面的机型判断逻辑。
内容的提问来源于stack exchange,提问作者Mohit Mangla
相关产品推荐
相关产品推荐

