Skip to content

Releases: voyager-software/DeviceLookup

Release years and isVision

Choose a tag to compare

@gabors gabors released this 31 Oct 17:27

New:

  • Device.year and Mac.year: the year the model was released, e.g. Device(modelIdentifier: "iPhone18,1").year is 2025. Every device and Mac in the data has one; an unknown device gives nil. 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, alongside isPhone through isMac.

Data pipeline:

  • Scripts/update-devices.py gives 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.py stores 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)

Choose a tag to compare

@gabors gabors released this 31 Oct 17:09

Data fixes:

  • Eight recent iPads now report hasCellular for 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), with family == .vision.
  • iPad mini (A20 Pro) (iPad19,1, iPad19,2), 8.5-inch.

Data pipeline:

  • Scripts/update-devices.py reads 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

Choose a tag to compare

@gabors gabors released this 31 Oct 16:50

Fix:

  • In an iPhone or iPad app running on a Mac ("Designed for iPhone/iPad"), Device.current now describes the Mac rather than the stand-in iPad the system reports (iPad8,6). It reads the model identifier from the hw.model sysctl, e.g. "Mac16,5" → "MacBook Pro (16-inch, 2024)", with family == .mac, and falls back to an unknown "Mac" if that doesn't name a Mac. Device.operatingSystemName is "macOS" there. The CPU brand string isn't readable from such an app, so chip is nil.

Documentation:

  • The README and DocC explain why the data is bundled and never fetched.

Mac.Family

Choose a tag to compare

@gabors gabors released this 31 Oct 04:24

Breaking change:

  • Mac.Kind is renamed Mac.Family, and Mac.kind is renamed Mac.family, matching Device.Family one level down: device.family is .mac, and device.mac?.family is .macBookPro. The cases and name are 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.all and Mac.Family in the Macs topic.
  • The migration guide is precise about which runtime state needs the main actor.

Mac data from Apple's pages

Choose a tag to compare

@gabors gabors released this 31 Oct 04:07
  • Mac minis Macmini5,1, Macmini5,2 (Mid 2011) and Macmini6,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, matching devices.json. Nothing in the API changes.

Documentation

Choose a tag to compare

@gabors gabors released this 31 Oct 02:03

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 Device being Sendable: it never touches UIDevice, so it works from any thread or actor.
  • Device.mac notes that an identifier Apple reused across models, such as MacBookPro15,1 for the 2018 and 2019 15-inch MacBook Pro, gives the newest of them.

API cleanup

Choose a tag to compare

@gabors gabors released this 31 Oct 01:19

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, systemUptime and the volume…Capacity properties. Replace Device.current.physicalMemory with Device.physicalMemory.
  • Mac.find(model:) is no longer public. Use Device(modelIdentifier:).mac.
  • Mac.models is renamed Mac.modelIdentifiers, matching Device.modelIdentifier.

Fixes:

  • Device.mac returns nil for a device that isn't a Mac without decoding the Mac data.
  • A Mac kind newer than Mac.Kind decodes as .unknown instead of leaving Mac.all empty.

2026 Mac Studios

Choose a tag to compare

@gabors gabors released this 30 Oct 09:37
  • Mac Studio (M5 Max, 2026) (Mac17,14) and Mac Studio (M5 Ultra, 2026) (Mac17,15).

Apple TV 4K (4th generation)

Choose a tag to compare

@gabors gabors released this 30 Oct 08:42
98b575b
  • 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

Choose a tag to compare

@gabors gabors released this 30 Oct 08:22
  • iPhone Duo (iPhone19,4) has its chip, A20 Pro, and screen diagonal, 7.6 inches. For a foldable, diagonal is the inner display's. Every device in the data now has a chip and a diagonal.