diff --git a/CHANGELOG.md b/CHANGELOG.md index f7d8410..5c23902 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Bug fixes + +- Correct portrait screen ratios, marketing names, and support links for later iPad Air and iPad Pro models. ([#457](https://github.com/devicekit/DeviceKit/issues/457)) + ## Version 5.9.0 Releasedate: 2026-09-22 diff --git a/Source/Device.generated.swift b/Source/Device.generated.swift index 1fc5534..89d0fac 100644 --- a/Source/Device.generated.swift +++ b/Source/Device.generated.swift @@ -338,7 +338,7 @@ public enum Device { /// /// ![Image](https://km.support.apple.com/resources/sites/APPLE/content/live/IMAGES/1000/IM1097/en_US/ipad-mini-6gen-240.png) case iPadMini6 - /// Device is an [iPad mini (A17 Pro)](https://support.apple.com/en-us/121456) + /// Device is an [iPad mini (A17 Pro)](https://support.apple.com/121456) /// /// ![Image](https://cdsassets.apple.com/live/7WUAS350/images/tech-specs/iPad_mini_A17_Pro_Wi-Fi_Lineup_Print__USEN.png) case iPadMiniA17Pro @@ -390,19 +390,19 @@ public enum Device { /// /// ![Image](https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP882/ipad-pro-4gen-mainimage_2x.png) case iPadPro12Inch6 - /// Device is an [iPad Pro 11-inch (M4)](https://support.apple.com/en-us/119892) + /// Device is an [iPad Pro 11-inch (M4)](https://support.apple.com/119892) /// /// ![Image](https://cdsassets.apple.com/content/services/pub/image?productid=301031&size=240x240) case iPadPro11M4 - /// Device is an [iPad Pro 13-inch (M4)](https://support.apple.com/en-us/119891) + /// Device is an [iPad Pro 13-inch (M4)](https://support.apple.com/119891) /// /// ![Image](https://cdsassets.apple.com/content/services/pub/image?productid=301033&size=240x240) case iPadPro13M4 - /// Device is an [iPad Pro 11-inch (M5)](https://support.apple.com/en-us/125406) + /// Device is an [iPad Pro 11-inch (M5)](https://support.apple.com/125406) /// /// ![Image](https://cdsassets.apple.com/content/services/pub/image?productid=301271&size=240x240) case iPadPro11M5 - /// Device is an [iPad Pro 13-inch (M5)](https://support.apple.com/en-us/125406) + /// Device is an [iPad Pro 13-inch (M5)](https://support.apple.com/125406) /// /// ![Image](https://cdsassets.apple.com/content/services/pub/image?productid=301273&size=240x240) case iPadPro13M5 @@ -985,11 +985,11 @@ public enum Device { case .iPadAir4: return (width: 41, height: 59) case .iPadAir5: return (width: 41, height: 59) case .iPadAir11M2: return (width: 41, height: 59) - case .iPadAir13M2: return (width: 683, height: 512) - case .iPadAir11M3: return (width: 59, height: 41) - case .iPadAir13M3: return (width: 683, height: 512) - case .iPadAir11M4: return (width: 59, height: 41) - case .iPadAir13M4: return (width: 683, height: 512) + case .iPadAir13M2: return (width: 512, height: 683) + case .iPadAir11M3: return (width: 41, height: 59) + case .iPadAir13M3: return (width: 512, height: 683) + case .iPadAir11M4: return (width: 41, height: 59) + case .iPadAir13M4: return (width: 512, height: 683) case .iPadMini: return (width: 3, height: 4) case .iPadMini2: return (width: 3, height: 4) case .iPadMini3: return (width: 3, height: 4) @@ -1009,10 +1009,10 @@ public enum Device { case .iPadPro12Inch5: return (width: 512, height: 683) case .iPadPro11Inch4: return (width: 139, height: 199) case .iPadPro12Inch6: return (width: 512, height: 683) - case .iPadPro11M4: return (width: 605, height: 417) - case .iPadPro13M4: return (width: 4, height: 3) - case .iPadPro11M5: return (width: 605, height: 417) - case .iPadPro13M5: return (width: 4, height: 3) + case .iPadPro11M4: return (width: 417, height: 605) + case .iPadPro13M4: return (width: 3, height: 4) + case .iPadPro11M5: return (width: 417, height: 605) + case .iPadPro13M5: return (width: 3, height: 4) case .homePod: return (width: 4, height: 5) case .simulator(let model): return model.screenRatio case .unknown: return (width: -1, height: -1) @@ -1749,12 +1749,12 @@ extension Device: CustomStringConvertible { case .iPadA16: return "iPad (A16)" case .iPadAir4: return "iPad Air (4th generation)" case .iPadAir5: return "iPad Air (5th generation)" - case .iPadAir11M2: return "iPad Air (11-inch) (M2)" - case .iPadAir13M2: return "iPad Air (13-inch) (M2)" - case .iPadAir11M3: return "iPad Air (11-inch) (M3)" - case .iPadAir13M3: return "iPad Air (13-inch) (M3)" - case .iPadAir11M4: return "iPad Air (11-inch) (M4)" - case .iPadAir13M4: return "iPad Air (13-inch) (M4)" + case .iPadAir11M2: return "iPad Air 11-inch (M2)" + case .iPadAir13M2: return "iPad Air 13-inch (M2)" + case .iPadAir11M3: return "iPad Air 11-inch (M3)" + case .iPadAir13M3: return "iPad Air 13-inch (M3)" + case .iPadAir11M4: return "iPad Air 11-inch (M4)" + case .iPadAir13M4: return "iPad Air 13-inch (M4)" case .iPadMini: return "iPad mini" case .iPadMini2: return "iPad mini 2" case .iPadMini3: return "iPad mini 3" @@ -1774,10 +1774,10 @@ extension Device: CustomStringConvertible { case .iPadPro12Inch5: return "iPad Pro (12.9-inch) (5th generation)" case .iPadPro11Inch4: return "iPad Pro (11-inch) (4th generation)" case .iPadPro12Inch6: return "iPad Pro (12.9-inch) (6th generation)" - case .iPadPro11M4: return "iPad Pro (11-inch) (M4)" - case .iPadPro13M4: return "iPad Pro (13-inch) (M4)" - case .iPadPro11M5: return "iPad Pro (11-inch) (M5)" - case .iPadPro13M5: return "iPad Pro (13-inch) (M5)" + case .iPadPro11M4: return "iPad Pro 11-inch (M4)" + case .iPadPro13M4: return "iPad Pro 13-inch (M4)" + case .iPadPro11M5: return "iPad Pro 11-inch (M5)" + case .iPadPro13M5: return "iPad Pro 13-inch (M5)" case .homePod: return "HomePod" case .simulator(let model): return "Simulator (\(model.description))" case .unknown(let identifier): return identifier @@ -1919,12 +1919,12 @@ extension Device: CustomStringConvertible { case .iPadA16: return "iPad (A16)" case .iPadAir4: return "iPad Air (4th generation)" case .iPadAir5: return "iPad Air (5th generation)" - case .iPadAir11M2: return "iPad Air (11-inch) (M2)" - case .iPadAir13M2: return "iPad Air (13-inch) (M2)" - case .iPadAir11M3: return "iPad Air (11-inch) (M3)" - case .iPadAir13M3: return "iPad Air (13-inch) (M3)" - case .iPadAir11M4: return "iPad Air (11-inch) (M4)" - case .iPadAir13M4: return "iPad Air (13-inch) (M4)" + case .iPadAir11M2: return "iPad Air 11-inch (M2)" + case .iPadAir13M2: return "iPad Air 13-inch (M2)" + case .iPadAir11M3: return "iPad Air 11-inch (M3)" + case .iPadAir13M3: return "iPad Air 13-inch (M3)" + case .iPadAir11M4: return "iPad Air 11-inch (M4)" + case .iPadAir13M4: return "iPad Air 13-inch (M4)" case .iPadMini: return "iPad mini" case .iPadMini2: return "iPad mini 2" case .iPadMini3: return "iPad mini 3" @@ -1944,10 +1944,10 @@ extension Device: CustomStringConvertible { case .iPadPro12Inch5: return "iPad Pro (12.9-inch) (5th generation)" case .iPadPro11Inch4: return "iPad Pro (11-inch) (4th generation)" case .iPadPro12Inch6: return "iPad Pro (12.9-inch) (6th generation)" - case .iPadPro11M4: return "iPad Pro (11-inch) (M4)" - case .iPadPro13M4: return "iPad Pro (13-inch) (M4)" - case .iPadPro11M5: return "iPad Pro (11-inch) (M5)" - case .iPadPro13M5: return "iPad Pro (13-inch) (M5)" + case .iPadPro11M4: return "iPad Pro 11-inch (M4)" + case .iPadPro13M4: return "iPad Pro 13-inch (M4)" + case .iPadPro11M5: return "iPad Pro 11-inch (M5)" + case .iPadPro13M5: return "iPad Pro 13-inch (M5)" case .homePod: return "HomePod" case .simulator(let model): return "Simulator (\(model.safeDescription))" case .unknown(let identifier): return identifier diff --git a/Source/Device.swift.gyb b/Source/Device.swift.gyb index 63b4348..3ad52de 100644 --- a/Source/Device.swift.gyb +++ b/Source/Device.swift.gyb @@ -329,27 +329,27 @@ iPads = [ cpu="m1", hasTouchID=True, hasRoundedDisplayCorners=True, applePencilSupport=23, cameras=1, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadAir11M2", "Device is an [iPad Air 11-inch (M2)](https://support.apple.com/119894)", "https://cdsassets.apple.com/content/services/pub/image?productid=301027&size=240x240", ["iPad14,8", "iPad14,9"], 10.9, (41, 59), "iPad Air (11-inch) (M2)", "iPad Air (11-inch) (M2)", 264, + Device("iPadAir11M2", "Device is an [iPad Air 11-inch (M2)](https://support.apple.com/119894)", "https://cdsassets.apple.com/content/services/pub/image?productid=301027&size=240x240", ["iPad14,8", "iPad14,9"], 10.9, (41, 59), "iPad Air 11-inch (M2)", "iPad Air 11-inch (M2)", 264, cpu="m2", hasTouchID=True, hasRoundedDisplayCorners=True, applePencilSupport=34, cameras=1, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadAir13M2", "Device is an [iPad Air 13-inch (M2)](https://support.apple.com/119893)", "https://cdsassets.apple.com/content/services/pub/image?productid=301029&size=240x240", ["iPad14,10", "iPad14,11"], 12.9, (683, 512), "iPad Air (13-inch) (M2)", "iPad Air (13-inch) (M2)", 264, + Device("iPadAir13M2", "Device is an [iPad Air 13-inch (M2)](https://support.apple.com/119893)", "https://cdsassets.apple.com/content/services/pub/image?productid=301029&size=240x240", ["iPad14,10", "iPad14,11"], 12.9, (512, 683), "iPad Air 13-inch (M2)", "iPad Air 13-inch (M2)", 264, cpu="m2", hasTouchID=True, hasRoundedDisplayCorners=True, applePencilSupport=34, cameras=1, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadAir11M3", "Device is an [iPad Air 11-inch (M3)](https://support.apple.com/122241)", "https://cdsassets.apple.com/content/services/pub/image?productid=301027&size=240x240", ["iPad15,3", "iPad15,4"], 10.9, (59, 41), "iPad Air (11-inch) (M3)", "iPad Air (11-inch) (M3)", 264, + Device("iPadAir11M3", "Device is an [iPad Air 11-inch (M3)](https://support.apple.com/122241)", "https://cdsassets.apple.com/content/services/pub/image?productid=301027&size=240x240", ["iPad15,3", "iPad15,4"], 10.9, (41, 59), "iPad Air 11-inch (M3)", "iPad Air 11-inch (M3)", 264, cpu="m3", hasTouchID=True, hasRoundedDisplayCorners=True, applePencilSupport=34, cameras=1, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadAir13M3", "Device is an [iPad Air 13-inch (M3)](https://support.apple.com/122242)", "https://cdsassets.apple.com/content/services/pub/image?productid=301029&size=240x240", ["iPad15,5", "iPad15,6"], 12.9, (683, 512), "iPad Air (13-inch) (M3)", "iPad Air (13-inch) (M3)", 264, + Device("iPadAir13M3", "Device is an [iPad Air 13-inch (M3)](https://support.apple.com/122242)", "https://cdsassets.apple.com/content/services/pub/image?productid=301029&size=240x240", ["iPad15,5", "iPad15,6"], 12.9, (512, 683), "iPad Air 13-inch (M3)", "iPad Air 13-inch (M3)", 264, cpu="m3", hasTouchID=True, hasRoundedDisplayCorners=True, applePencilSupport=34, cameras=1, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadAir11M4", "Device is an [iPad Air 11-inch (M4)](https://support.apple.com/126471)", "", ["iPad16,8", "iPad16,9"], 10.9, (59, 41), "iPad Air (11-inch) (M4)", "iPad Air (11-inch) (M4)", 264, + Device("iPadAir11M4", "Device is an [iPad Air 11-inch (M4)](https://support.apple.com/126471)", "", ["iPad16,8", "iPad16,9"], 10.9, (41, 59), "iPad Air 11-inch (M4)", "iPad Air 11-inch (M4)", 264, cpu="m4", hasTouchID=True, hasRoundedDisplayCorners=True, applePencilSupport=34, cameras=1, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadAir13M4", "Device is an [iPad Air 13-inch (M4)](https://support.apple.com/126472)", "", ["iPad16,10", "iPad16,11"], 12.9, (683, 512), "iPad Air (13-inch) (M4)", "iPad Air (13-inch) (M4)", 264, + Device("iPadAir13M4", "Device is an [iPad Air 13-inch (M4)](https://support.apple.com/126472)", "", ["iPad16,10", "iPad16,11"], 12.9, (512, 683), "iPad Air 13-inch (M4)", "iPad Air 13-inch (M4)", 264, cpu="m4", hasTouchID=True, hasRoundedDisplayCorners=True, applePencilSupport=34, cameras=1, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), @@ -368,7 +368,7 @@ iPads = [ cpu="a15Bionic", isPadMiniFormFactor=True, hasTouchID=True, hasRoundedDisplayCorners=True, applePencilSupport=23, cameras=1, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadMiniA17Pro", "Device is an [iPad mini (A17 Pro)](https://support.apple.com/en-us/121456)", "https://cdsassets.apple.com/live/7WUAS350/images/tech-specs/iPad_mini_A17_Pro_Wi-Fi_Lineup_Print__USEN.png", ["iPad16,1", "iPad16,2"], 8.3, (744, 1133), "iPad mini (A17 Pro)", "iPad mini (A17 Pro)", 326, + Device("iPadMiniA17Pro", "Device is an [iPad mini (A17 Pro)](https://support.apple.com/121456)", "https://cdsassets.apple.com/live/7WUAS350/images/tech-specs/iPad_mini_A17_Pro_Wi-Fi_Lineup_Print__USEN.png", ["iPad16,1", "iPad16,2"], 8.3, (744, 1133), "iPad mini (A17 Pro)", "iPad mini (A17 Pro)", 326, cpu="a17Pro", isPadMiniFormFactor=True, hasTouchID=True, hasRoundedDisplayCorners=True, applePencilSupport=34, cameras=1, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), @@ -412,19 +412,19 @@ iPads = [ cpu="m2", isPro=True, hasFaceID=True, hasRoundedDisplayCorners=True, applePencilSupport=23, cameras=13, hasLidarSensor=True, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadPro11M4", "Device is an [iPad Pro 11-inch (M4)](https://support.apple.com/en-us/119892)", "https://cdsassets.apple.com/content/services/pub/image?productid=301031&size=240x240", ["iPad16,3", "iPad16,4"], 11.0, (605, 417), "iPad Pro (11-inch) (M4)", "iPad Pro (11-inch) (M4)", 264, + Device("iPadPro11M4", "Device is an [iPad Pro 11-inch (M4)](https://support.apple.com/119892)", "https://cdsassets.apple.com/content/services/pub/image?productid=301031&size=240x240", ["iPad16,3", "iPad16,4"], 11.0, (417, 605), "iPad Pro 11-inch (M4)", "iPad Pro 11-inch (M4)", 264, cpu="m4", isPro=True, hasFaceID=True, hasRoundedDisplayCorners=True, applePencilSupport=34, cameras=1, hasLidarSensor=True, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadPro13M4", "Device is an [iPad Pro 13-inch (M4)](https://support.apple.com/en-us/119891)", "https://cdsassets.apple.com/content/services/pub/image?productid=301033&size=240x240", ["iPad16,5", "iPad16,6"], 13.0, (4, 3), "iPad Pro (13-inch) (M4)", "iPad Pro (13-inch) (M4)", 264, + Device("iPadPro13M4", "Device is an [iPad Pro 13-inch (M4)](https://support.apple.com/119891)", "https://cdsassets.apple.com/content/services/pub/image?productid=301033&size=240x240", ["iPad16,5", "iPad16,6"], 13.0, (3, 4), "iPad Pro 13-inch (M4)", "iPad Pro 13-inch (M4)", 264, cpu="m4", isPro=True, hasFaceID=True, hasRoundedDisplayCorners=True, applePencilSupport=34, cameras=1, hasLidarSensor=True, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadPro11M5", "Device is an [iPad Pro 11-inch (M5)](https://support.apple.com/en-us/125406)", "https://cdsassets.apple.com/content/services/pub/image?productid=301271&size=240x240", ["iPad17,1", "iPad17,2"], 11.0, (605, 417), "iPad Pro (11-inch) (M5)", "iPad Pro (11-inch) (M5)", 264, + Device("iPadPro11M5", "Device is an [iPad Pro 11-inch (M5)](https://support.apple.com/125406)", "https://cdsassets.apple.com/content/services/pub/image?productid=301271&size=240x240", ["iPad17,1", "iPad17,2"], 11.0, (417, 605), "iPad Pro 11-inch (M5)", "iPad Pro 11-inch (M5)", 264, cpu="m5", isPro=True, hasFaceID=True, hasRoundedDisplayCorners=True, applePencilSupport=234, cameras=1, hasLidarSensor=True, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), - Device("iPadPro13M5", "Device is an [iPad Pro 13-inch (M5)](https://support.apple.com/en-us/125406)", "https://cdsassets.apple.com/content/services/pub/image?productid=301273&size=240x240", ["iPad17,3", "iPad17,4"], 13.0, (4, 3), "iPad Pro (13-inch) (M5)", "iPad Pro (13-inch) (M5)", 264, + Device("iPadPro13M5", "Device is an [iPad Pro 13-inch (M5)](https://support.apple.com/125406)", "https://cdsassets.apple.com/content/services/pub/image?productid=301273&size=240x240", ["iPad17,3", "iPad17,4"], 13.0, (3, 4), "iPad Pro 13-inch (M5)", "iPad Pro 13-inch (M5)", 264, cpu="m5", isPro=True, hasFaceID=True, hasRoundedDisplayCorners=True, applePencilSupport=234, cameras=1, hasLidarSensor=True, hasUSBCConnectivity=True, has5gSupport=True, hasEsimSupport=True), diff --git a/Tests/Tests.swift b/Tests/Tests.swift index ce99bbc..26bfd74 100644 --- a/Tests/Tests.swift +++ b/Tests/Tests.swift @@ -346,6 +346,27 @@ class DeviceKitTests: XCTestCase { XCTAssertTrue(Device.iPadPro11Inch.screenRatio == (width: 139, height: 199)) XCTAssertTrue(Device.iPadPro12Inch3.screenRatio == (width: 512, height: 683)) + for model in [Device.iPadAir11M3, .iPadAir11M4] { + for variant in [model, .simulator(model)] { + XCTAssertTrue(variant.screenRatio == (width: 41, height: 59)) + } + } + for model in [Device.iPadAir13M2, .iPadAir13M3, .iPadAir13M4] { + for variant in [model, .simulator(model)] { + XCTAssertTrue(variant.screenRatio == (width: 512, height: 683)) + } + } + for model in [Device.iPadPro11M4, .iPadPro11M5] { + for variant in [model, .simulator(model)] { + XCTAssertTrue(variant.screenRatio == (width: 417, height: 605)) + } + } + for model in [Device.iPadPro13M4, .iPadPro13M5] { + for variant in [model, .simulator(model)] { + XCTAssertTrue(variant.screenRatio == (width: 3, height: 4)) + } + } + XCTAssertTrue(Device.simulator(device).screenRatio == device.screenRatio) XCTAssertTrue(Device.unknown(UUID().uuidString).screenRatio == (width: -1, height: -1)) } @@ -439,6 +460,16 @@ class DeviceKitTests: XCTestCase { XCTAssertEqual(Device.iPadPro10Inch.description, "iPad Pro (10.5-inch)") XCTAssertEqual(Device.iPadPro11Inch.description, "iPad Pro (11-inch)") XCTAssertEqual(Device.iPadPro12Inch3.description, "iPad Pro (12.9-inch) (3rd generation)") + XCTAssertEqual(Device.iPadAir11M2.description, "iPad Air 11-inch (M2)") + XCTAssertEqual(Device.iPadAir13M2.description, "iPad Air 13-inch (M2)") + XCTAssertEqual(Device.iPadAir11M3.description, "iPad Air 11-inch (M3)") + XCTAssertEqual(Device.iPadAir13M3.description, "iPad Air 13-inch (M3)") + XCTAssertEqual(Device.iPadAir11M4.description, "iPad Air 11-inch (M4)") + XCTAssertEqual(Device.iPadAir13M4.description, "iPad Air 13-inch (M4)") + XCTAssertEqual(Device.iPadPro11M4.description, "iPad Pro 11-inch (M4)") + XCTAssertEqual(Device.iPadPro13M4.description, "iPad Pro 13-inch (M4)") + XCTAssertEqual(Device.iPadPro11M5.description, "iPad Pro 11-inch (M5)") + XCTAssertEqual(Device.iPadPro13M5.description, "iPad Pro 13-inch (M5)") XCTAssertEqual(Device.simulator(Device.iPadPro10Inch).description, "Simulator (\(Device.iPadPro10Inch))") let uuid = UUID().uuidString XCTAssertEqual(Device.unknown(uuid).description, uuid)