Repository navigation
Releases: voyager-software/DeviceLookup
Releases · voyager-software/DeviceLookup
Release list
Release years and isVision
New:
Device.yearandMac.year: the year the model was released, e.g.Device(modelIdentifier: "iPhone18,1").yearis 2025. Every device and Mac in the data has one; an unknown device givesnil. For a Mac identifier Apple reused across models, it's the newest model's year, matching its name. Xcode names the 2020 and 2022 Apple Watch SE alike, so the year is what tells them apart.Device.isVision, alongsideisPhonethroughisMac.
Data pipeline:
Scripts/update-devices.pygives a new device the current year, since Xcode lists devices around their announcement; correct it by hand if a device ships the next year.Scripts/update-macs.pystores each Mac's year, taken from its name.- The tests fail until every device and Mac has a year.
Cellular iPads, Apple Vision Pro, iPad mini (A20 Pro)
Data fixes:
- Eight recent iPads now report
hasCellularfor their cellular identifier: iPad Air 11-inch and 13-inch (M3) and (M4), iPad (A16), iPad mini (A17 Pro) and iPad Pro 11-inch and 13-inch (M5). Both identifiers of each had been Wi-Fi.
New devices:
- Apple Vision Pro (
RealityDevice14,1, M2) and Apple Vision Pro (M5) (RealityDevice17,1), withfamily == .vision. - iPad mini (A20 Pro) (
iPad19,1,iPad19,2), 8.5-inch.
Data pipeline:
Scripts/update-devices.pyreads Xcode's visionOS device list too, and marks a new device cellular when the device Xcode falls back to is, since each device falls back to its predecessor of the same kind.- A test fails if an iPad model has several identifiers and none of them is cellular.
iPhone and iPad apps on a Mac
Fix:
- In an iPhone or iPad app running on a Mac ("Designed for iPhone/iPad"),
Device.currentnow describes the Mac rather than the stand-in iPad the system reports (iPad8,6). It reads the model identifier from thehw.modelsysctl, e.g. "Mac16,5" → "MacBook Pro (16-inch, 2024)", withfamily == .mac, and falls back to an unknown "Mac" if that doesn't name a Mac.Device.operatingSystemNameis "macOS" there. The CPU brand string isn't readable from such an app, sochipisnil.
Documentation:
- The README and DocC explain why the data is bundled and never fetched.
Mac.Family
Breaking change:
Mac.Kindis renamedMac.Family, andMac.kindis renamedMac.family, matchingDevice.Familyone level down:device.familyis.mac, anddevice.mac?.familyis.macBookPro. The cases andnameare unchanged.
Documentation:
- The README and DocC are checked against the current API: a Mac example name that's in the data, the source of the Mac data, a Device Families topic, and
Mac.allandMac.Familyin the Macs topic. - The migration guide is precise about which runtime state needs the main actor.
Mac data from Apple's pages
- Mac minis
Macmini5,1,Macmini5,2(Mid 2011) andMacmini6,1,Macmini6,2(Late 2012) now resolve. They were stored as two identifiers run together. - iMac Pro is named "iMac Pro (2017)", as Apple names it.
- The Mac data is generated from Apple's "Identify your Mac model" pages by
Scripts/update-macs.py, and the weekly update workflow now checks for new Macs as well as new devices. - The bundled Mac data is renamed
macs.json, matchingdevices.json. Nothing in the API changes.
Documentation
Documentation only; no code or data changes.
- The DeviceKit migration guide shows how to check for specific models with a set of identifiers instead of enum cases.
- The overview leads with
DevicebeingSendable: it never touchesUIDevice, so it works from any thread or actor. Device.macnotes that an identifier Apple reused across models, such asMacBookPro15,1for the 2018 and 2019 15-inch MacBook Pro, gives the newest of them.
API cleanup
Breaking changes:
- The running-system details are static, since they describe the device the code runs on, not a looked-up
Device:Device.operatingSystemName,operatingSystemVersion,operatingSystemVersionString,physicalMemory,processorCount,systemUptimeand thevolume…Capacityproperties. ReplaceDevice.current.physicalMemorywithDevice.physicalMemory. Mac.find(model:)is no longer public. UseDevice(modelIdentifier:).mac.Mac.modelsis renamedMac.modelIdentifiers, matchingDevice.modelIdentifier.
Fixes:
Device.macreturnsnilfor a device that isn't a Mac without decoding the Mac data.- A Mac kind newer than
Mac.Kinddecodes as.unknowninstead of leavingMac.allempty.
2026 Mac Studios
- Mac Studio (M5 Max, 2026) (
Mac17,14) and Mac Studio (M5 Ultra, 2026) (Mac17,15).
Apple TV 4K (4th generation)
- Apple TV 4K (4th generation) (
AppleTV18,1), A19, from Xcode 27.2. - Documentation: an overview page and a Migrating from DeviceKit article, for the Swift Package Index documentation.
- An Update devices workflow checks the newest Xcode on GitHub's runners every Monday and opens a pull request when it lists devices that aren't in the data yet. It found this Apple TV on its first run.
- The README has a Maintenance section.
iPhone Duo
- iPhone Duo (
iPhone19,4) has its chip, A20 Pro, and screen diagonal, 7.6 inches. For a foldable,diagonalis the inner display's. Every device in the data now has a chip and a diagonal.