diff --git a/CHANGELOG.md b/CHANGELOG.md index 09804786..289cf950 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.10.0 Releasedate: 2026-11-01 diff --git a/Source/Device.generated.swift b/Source/Device.generated.swift index b10138c7..3c8c19bc 100644 --- a/Source/Device.generated.swift +++ b/Source/Device.generated.swift @@ -342,7 +342,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 @@ -394,19 +394,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 @@ -1005,11 +1005,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) @@ -1029,10 +1029,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) @@ -1774,12 +1774,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" @@ -1799,10 +1799,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 @@ -1945,12 +1945,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" @@ -1970,10 +1970,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 af7f2821..a1777136 100644 --- a/Source/Device.swift.gyb +++ b/Source/Device.swift.gyb @@ -339,27 +339,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), @@ -378,7 +378,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), @@ -422,19 +422,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 2809633a..66214cdf 100644 --- a/Tests/Tests.swift +++ b/Tests/Tests.swift @@ -435,6 +435,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)) } @@ -528,6 +549,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)