Bug Fixes
CoreData crash on upgrade
- Fixed a crash when saving brokers after upgrading from an older app version. The CoreData
store could fail to open due to a schema mismatch, but the app continued running with a broken
database. The app now detects the failure, recovers by recreating the store, and shows an
error view instead of crashing. iCloud-synced brokers reappear automatically.
Background terminations
- Fixed the most common crash across all versions. iOS killed the app when it was suspended
while holding SQLite file locks from active MQTT connections. The app now uses a background
task to keep sessions alive briefly, and cleanly disconnects before iOS suspends the process.
iCloud initialization blocking main thread
- Moved iCloud directory initialization off the main thread. The iCloud ubiquity container
lookup can block, and if iOS suspended the app during that call, it was killed for holding a
file lock.
CocoaMQTT Fixes (updated to 2.2.5-apple-network)
- FramePublish: invalid range crash — Fixed bytes[2...(pos-1)] crashing when the broker sends
a PUBLISH with an empty topic. - MqttDecodeConnAck: nil dictionary crash — Fixed force-unwrap of userProperty which was never
initialized. Brokers sending CONNACK with user properties triggered the crash. - MqttDecodePublish: UInt8 overflow — Added bounds check before converting property name byte.
Malformed packets with values > 255 caused a Swift runtime trap. - CocoaMQTTReader: allocation crash — Capped maximum frame length at the MQTT spec limit (256
MB). Malformed packets could cause the reader to allocate an impossibly large array.