Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ This version adds support for the iPhone 17 series, Apple Watch Ultra 3 and Appl
- Missing device identifiers for Apple Watch Series 9 were added.
- Docs for Apple Watch Series 9 was updated to include specs links
- Fixed Apple Pencil support for iPad Mini (A17 Pro).
- Fixed Apple Pencil compatibility for M4 iPad Pro, M2/M3 iPad Air, iPad (10th gen), and iPad (A16) models.

Thanks to all the contributers of this release!
- [Jager-yoo](https://github.com/Jager-yoo)
Expand Down
16 changes: 8 additions & 8 deletions Source/Device.generated.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2199,8 +2199,8 @@ extension Device {
case .iPadPro12Inch: return .firstGeneration
case .iPadPro12Inch2: return .firstGeneration
case .iPadPro10Inch: return .firstGeneration
case .iPad10: return .firstGenerationUsbC
case .iPadA16: return .firstGenerationUsbC
case .iPad10: return [.firstGeneration, .firstGenerationUsbC]
case .iPadA16: return [.firstGeneration, .firstGenerationUsbC]
case .iPadAir4: return [.secondGeneration, .firstGenerationUsbC]
case .iPadAir5: return [.secondGeneration, .firstGenerationUsbC]
case .iPadMini6: return [.secondGeneration, .firstGenerationUsbC]
Expand All @@ -2212,13 +2212,13 @@ extension Device {
case .iPadPro12Inch5: return [.secondGeneration, .firstGenerationUsbC]
case .iPadPro11Inch4: return [.secondGeneration, .firstGenerationUsbC]
case .iPadPro12Inch6: return [.secondGeneration, .firstGenerationUsbC]
case .iPadPro11M4: return [.secondGeneration, .firstGenerationUsbC, .pro]
case .iPadPro13M4: return [.secondGeneration, .firstGenerationUsbC, .pro]
case .iPadAir11M2: return [.secondGeneration, .pro]
case .iPadAir13M2: return [.secondGeneration, .pro]
case .iPadAir11M3: return [.secondGeneration, .pro]
case .iPadAir13M3: return [.secondGeneration, .pro]
case .iPadAir11M2: return [.firstGenerationUsbC, .pro]
case .iPadAir13M2: return [.firstGenerationUsbC, .pro]
case .iPadAir11M3: return [.firstGenerationUsbC, .pro]
case .iPadAir13M3: return [.firstGenerationUsbC, .pro]
case .iPadMiniA17Pro: return [.firstGenerationUsbC, .pro]
case .iPadPro11M4: return [.firstGenerationUsbC, .pro]
case .iPadPro13M4: return [.firstGenerationUsbC, .pro]
case .simulator(let model): return model.applePencilSupport
default: return []
}
Expand Down
19 changes: 11 additions & 8 deletions Source/Device.swift.gyb
Original file line number Diff line number Diff line change
Expand Up @@ -109,14 +109,14 @@ iPads = [
Device("iPad7", "Device is an [iPad (7th generation)](https://support.apple.com/kb/SP807)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP807/sp807-ipad-7th-gen_2x.png", ["iPad7,11", "iPad7,12"], 10.2, (3, 4), "iPad (7th generation)", "iPad (7th generation)", 264, False, False, False, False, True, False, False, False, False, False, 1, False, 1, False, "a10Fusion", False, False),
Device("iPad8", "Device is an [iPad (8th generation)](https://support.apple.com/kb/SP822)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP822/sp822-ipad-8gen_2x.png", ["iPad11,6", "iPad11,7"], 10.2, (3, 4), "iPad (8th generation)", "iPad (8th generation)", 264, False, False, False, False, True, False, False, False, False, False, 1, False, 1, False, "a12Bionic", False, False),
Device("iPad9", "Device is an [iPad (9th generation)](https://support.apple.com/kb/SP849)", "https://km.support.apple.com/resources/sites/APPLE/content/live/IMAGES/1000/IM1096/en_US/ipad-9gen-240.png", ["iPad12,1", "iPad12,2"], 10.2, (3, 4), "iPad (9th generation)", "iPad (9th generation)", 264, False, False, False, False, True, False, False, False, False, False, 1, False, 1, False, "a13Bionic", False, False),
Device("iPad10", "Device is an [iPad (10th generation)](https://support.apple.com/kb/SP884)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP884/sp884-ipad-10gen-960_2x.png", ["iPad13,18", "iPad13,19"], 10.9, (41, 59), "iPad (10th generation)", "iPad (10th generation)", 264, False, False, False, False, True, False, False, False, True, False, 3, False, 1, False, "a14Bionic", True, True),
Device("iPadA16", "Device is an [iPad (A16)]()", "", ["iPad15,7", "iPad15,8"], 10.9, (41, 59), "iPad (A16)", "iPad (A16)", 264, False, False, False, False, True, False, False, False, True, False, 3, False, 1, False, "a16Bionic", True, True),
Device("iPad10", "Device is an [iPad (10th generation)](https://support.apple.com/kb/SP884)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP884/sp884-ipad-10gen-960_2x.png", ["iPad13,18", "iPad13,19"], 10.9, (41, 59), "iPad (10th generation)", "iPad (10th generation)", 264, False, False, False, False, True, False, False, False, True, False, 13, False, 1, False, "a14Bionic", True, True),
Device("iPadA16", "Device is an [iPad (A16)]()", "", ["iPad15,7", "iPad15,8"], 10.9, (41, 59), "iPad (A16)", "iPad (A16)", 264, False, False, False, False, True, False, False, False, True, False, 13, False, 1, False, "a16Bionic", True, True),
Device("iPadAir4", "Device is an [iPad Air (4th generation)](https://support.apple.com/kb/SP828)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP828/sp828ipad-air-ipados14-960_2x.png", ["iPad13,1", "iPad13,2"], 10.9, (41, 59), "iPad Air (4th generation)", "iPad Air (4th generation)", 264, False, False, False, False, True, False, False, False, True, False, 23, False, 1, False, "a14Bionic", True, False),
Device("iPadAir5", "Device is an [iPad Air (5th generation)](https://support.apple.com/kb/SP866)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP866/sp866-ipad-air-5gen_2x.png", ["iPad13,16", "iPad13,17"], 10.9, (41, 59), "iPad Air (5th generation)", "iPad Air (5th generation)", 264, False, False, False, False, True, False, False, False, True, False, 23, False, 1, False, "m1", True, True),
Device("iPadAir11M2", "Device is an [iPad Air 11-inch (M2)](https://support.apple.com/en-us/119894)", "https://cdsassets.apple.com/content/services/pub/image?productid=301027&size=240x240", ["iPad14,8", "iPad14,9"], 10.9, (59, 41), "iPad Air (11-inch) (M2)", "iPad Air (11-inch) (M2)", 264, False, False, False, False, True, False, False, False, True, False, 24, False, 1, False, "m2", True, True),
Device("iPadAir13M2", "Device is an [iPad Air 13-inch (M2)](https://support.apple.com/en-us/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, False, False, False, False, True, False, False, False, True, False, 24, False, 1, False, "m2", True, True),
Device("iPadAir11M3", "Device is an [iPad Air 11-inch (M3)]()", "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, False, False, False, False, True, False, False, False, True, False, 24, False, 1, False, "m3", True, True),
Device("iPadAir13M3", "Device is an [iPad Air 13-inch (M3)]()", "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, False, False, False, False, True, False, False, False, True, False, 24, False, 1, False, "m3", True, True),
Device("iPadAir11M2", "Device is an [iPad Air 11-inch (M2)](https://support.apple.com/en-us/119894)", "https://cdsassets.apple.com/content/services/pub/image?productid=301027&size=240x240", ["iPad14,8", "iPad14,9"], 10.9, (59, 41), "iPad Air (11-inch) (M2)", "iPad Air (11-inch) (M2)", 264, False, False, False, False, True, False, False, False, True, False, 34, False, 1, False, "m2", True, True),
Device("iPadAir13M2", "Device is an [iPad Air 13-inch (M2)](https://support.apple.com/en-us/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, False, False, False, False, True, False, False, False, True, False, 34, False, 1, False, "m2", True, True),
Device("iPadAir11M3", "Device is an [iPad Air 11-inch (M3)]()", "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, False, False, False, False, True, False, False, False, True, False, 34, False, 1, False, "m3", True, True),
Device("iPadAir13M3", "Device is an [iPad Air 13-inch (M3)]()", "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, False, False, False, False, True, False, False, False, True, False, 34, False, 1, False, "m3", True, True),
Device("iPadMini", "Device is an [iPad Mini](https://support.apple.com/kb/SP661)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP661/sp661_ipad_mini_color.jpg", ["iPad2,5", "iPad2,6", "iPad2,7"], 7.9, (3, 4), "iPad Mini", "iPad Mini", 163, False, True, False, False, False, False, False, False, False, False, 0, False, 1, False, "a5", False, False),
Device("iPadMini2", "Device is an [iPad Mini 2](https://support.apple.com/kb/SP693)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP693/SP693-specs_color-mul.png", ["iPad4,4", "iPad4,5", "iPad4,6"], 7.9, (3, 4), "iPad Mini 2", "iPad Mini 2", 326, False, True, False, False, False, False, False, False, False, False, 0, False, 1, False, "a7", False, False),
Device("iPadMini3", "Device is an [iPad Mini 3](https://support.apple.com/kb/SP709)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP709/SP709-space_gray.jpeg", ["iPad4,7", "iPad4,8", "iPad4,9"], 7.9, (3, 4), "iPad Mini 3", "iPad Mini 3", 326, False, True, False, False, True, False, False, False, False, False, 0, False, 1, False, "a7", False, False),
Expand All @@ -136,8 +136,8 @@ iPads = [
Device("iPadPro12Inch5", "Device is an [iPad Pro 12.9-inch (5th generation)](https://support.apple.com/kb/SP844)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP844/ipad-pro-12-9_2x.png", ["iPad13,8", "iPad13,9", "iPad13,10", "iPad13,11"], 12.9, (512, 683), "iPad Pro (12.9-inch) (5th generation)", "iPad Pro (12.9-inch) (5th generation)", 264, False, False, True, False, False, True, False, False, True, False, 23, False, 13, True, "m1", True, True),
Device("iPadPro11Inch4", "Device is an [iPad Pro 11-inch (4th generation)](https://support.apple.com/kb/SP882)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP882/ipad-pro-4gen-mainimage_2x.png", ["iPad14,3", "iPad14,4"], 11.0, (139, 199), "iPad Pro (11-inch) (4th generation)", "iPad Pro (11-inch) (4th generation)", 264, False, False, True, False, False, True, False, False, True, False, 23, False, 13, True, "m2", True, True),
Device("iPadPro12Inch6", "Device is an [iPad Pro 12.9-inch (6th generation)](https://support.apple.com/kb/SP883)", "https://support.apple.com/library/APPLE/APPLECARE_ALLGEOS/SP882/ipad-pro-4gen-mainimage_2x.png", ["iPad14,5", "iPad14,6"], 12.9, (512, 683), "iPad Pro (12.9-inch) (6th generation)", "iPad Pro (12.9-inch) (6th generation)", 264, False, False, True, False, False, True, False, False, True, False, 23, False, 13, True, "m2", True, 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, False, False, True, False, False, True, False, False, True, False, 234, False, 1, True, "m4", True, 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, False, False, True, False, False, True, False, False, True, False, 234, False, 1, True, "m4", True, 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, False, False, True, False, False, True, False, False, True, False, 34, False, 1, True, "m4", True, 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, False, False, True, False, False, True, False, False, True, False, 34, False, 1, True, "m4", True, True),
]

homePods = [
Expand Down Expand Up @@ -1342,6 +1342,9 @@ extension Device {
% for device in list(filter(lambda device: device.applePencilSupport == 4, iOSDevices)):
case .${device.caseName}: return [.pro]
% end
% for device in list(filter(lambda device: device.applePencilSupport == 13, iOSDevices)):
case .${device.caseName}: return [.firstGeneration, .firstGenerationUsbC]
% end
% for device in list(filter(lambda device: device.applePencilSupport == 23, iOSDevices)):
case .${device.caseName}: return [.secondGeneration, .firstGenerationUsbC]
% end
Expand Down
50 changes: 50 additions & 0 deletions Tests/Tests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,56 @@ class DeviceKitTests: XCTestCase {
}
}

func testApplePencilSupport() {
// Test iPad (10th gen) - Supports Apple Pencil (1st gen) and Apple Pencil (USB-C)
XCTAssertTrue(Device.iPad10.applePencilSupport.contains(.firstGeneration))
XCTAssertTrue(Device.iPad10.applePencilSupport.contains(.firstGenerationUsbC))
XCTAssertFalse(Device.iPad10.applePencilSupport.contains(.secondGeneration))
XCTAssertFalse(Device.iPad10.applePencilSupport.contains(.pro))

// Test iPad (A16) - Supports Apple Pencil (1st gen) and Apple Pencil (USB-C)
XCTAssertTrue(Device.iPadA16.applePencilSupport.contains(.firstGeneration))
XCTAssertTrue(Device.iPadA16.applePencilSupport.contains(.firstGenerationUsbC))
XCTAssertFalse(Device.iPadA16.applePencilSupport.contains(.secondGeneration))
XCTAssertFalse(Device.iPadA16.applePencilSupport.contains(.pro))

// Test iPad Air 11" (M2) - Supports Apple Pencil Pro and Apple Pencil (USB-C)
XCTAssertFalse(Device.iPadAir11M2.applePencilSupport.contains(.firstGeneration))
XCTAssertTrue(Device.iPadAir11M2.applePencilSupport.contains(.firstGenerationUsbC))
XCTAssertFalse(Device.iPadAir11M2.applePencilSupport.contains(.secondGeneration))
XCTAssertTrue(Device.iPadAir11M2.applePencilSupport.contains(.pro))

// Test iPad Air 13" (M2) - Supports Apple Pencil Pro and Apple Pencil (USB-C)
XCTAssertFalse(Device.iPadAir13M2.applePencilSupport.contains(.firstGeneration))
XCTAssertTrue(Device.iPadAir13M2.applePencilSupport.contains(.firstGenerationUsbC))
XCTAssertFalse(Device.iPadAir13M2.applePencilSupport.contains(.secondGeneration))
XCTAssertTrue(Device.iPadAir13M2.applePencilSupport.contains(.pro))

// Test iPad Air 11" (M3) - Supports Apple Pencil Pro and Apple Pencil (USB-C)
XCTAssertFalse(Device.iPadAir11M3.applePencilSupport.contains(.firstGeneration))
XCTAssertTrue(Device.iPadAir11M3.applePencilSupport.contains(.firstGenerationUsbC))
XCTAssertFalse(Device.iPadAir11M3.applePencilSupport.contains(.secondGeneration))
XCTAssertTrue(Device.iPadAir11M3.applePencilSupport.contains(.pro))

// Test iPad Air 13" (M3) - Supports Apple Pencil Pro and Apple Pencil (USB-C)
XCTAssertFalse(Device.iPadAir13M3.applePencilSupport.contains(.firstGeneration))
XCTAssertTrue(Device.iPadAir13M3.applePencilSupport.contains(.firstGenerationUsbC))
XCTAssertFalse(Device.iPadAir13M3.applePencilSupport.contains(.secondGeneration))
XCTAssertTrue(Device.iPadAir13M3.applePencilSupport.contains(.pro))

// Test iPad Pro 11" (M4) - Supports Apple Pencil Pro and Apple Pencil (USB-C)
XCTAssertFalse(Device.iPadPro11M4.applePencilSupport.contains(.firstGeneration))
XCTAssertTrue(Device.iPadPro11M4.applePencilSupport.contains(.firstGenerationUsbC))
XCTAssertFalse(Device.iPadPro11M4.applePencilSupport.contains(.secondGeneration))
XCTAssertTrue(Device.iPadPro11M4.applePencilSupport.contains(.pro))

// Test iPad Pro 13" (M4) - Supports Apple Pencil Pro and Apple Pencil (USB-C)
XCTAssertFalse(Device.iPadPro13M4.applePencilSupport.contains(.firstGeneration))
XCTAssertTrue(Device.iPadPro13M4.applePencilSupport.contains(.firstGenerationUsbC))
XCTAssertFalse(Device.iPadPro13M4.applePencilSupport.contains(.secondGeneration))
XCTAssertTrue(Device.iPadPro13M4.applePencilSupport.contains(.pro))
}

#endif

// MARK: - tvOS
Expand Down