v10.10.3
Highlights
🐛 DTX/XCTest payloads decode correctly under Python 3.15 lazy imports
On Python 3.15+ the CLI and test suite run with PEP 810 lazy imports. The NSKeyedArchive proxy classes used to decode DTX and XCTest payloads were registered with bpylist2 only as an import-time side effect, and a lazily-imported module body does not run until one of its names is actually used. Decode paths that reach archiver.unarchive() without touching such a name therefore saw an unpopulated class map and silently fell back to plistlib, logging a warning per message and returning the raw archive dict instead of the decoded object.
Two independent cases were affected and are now fixed by registering the classes through an explicit, idempotent call instead of relying on the import side effect:
- DTX tap messages (
DTSysmonTapMessage,DTTapHeartbeatMessage, ...) — surfaced as decode warnings ondeveloper dvt sysmonand other tap-based commands. - XCTest result types (
XCTIssue,XCActivityRecord,XCTestConfiguration, ...) — XCUITest results decoded to raw plist dicts instead of typed objects.
# Previously noisy on Python 3.15; now clean:
pymobiledevice3 developer dvt sysmon process single -k execNameThis only affected Python 3.15; Python ≤ 3.14 (eager imports) was never impacted.
What's Changed
- 03a0e3c dtx: Register NSKeyedArchive classes explicitly for lazy imports (#1864) (@doronz88)
- 264429b dtx: Register XCTest NSKeyedArchive classes explicitly for lazy imports (#1864) (@doronz88)
Full Changelog: v10.10.2...v10.10.3