1. v4.15.1iOSMajor
    UniFi Protect
    
    - Added support for UniFi Protect third-party ONVIF camera RTSP data.
    - Improved camera discovery labels using richer Protect metadata like display name, market name, type, host, MAC, and port.
    - Revised third-party camera streaming to use local-only Protect-exposed streams via the local Integration API and X-API-KEY, avoiding direct third-party camera RTSP fallback.
    - Updated UniFi configuration/search UI to make unconfigured or unavailable third-party stream states clearer.
    - Redacted sensitive local API key data from debug output.
    
    Streaming/UI Behavior
    
    - Disabled UIKit’s fragile hidesBarsOnSwipe path while streaming after a nav-bar gesture crash.
    - Refactored toolbar hover/touch visibility handling so explicit swipes are not immediately undone by hover timers.
    - Fixed stream profile view lifecycle cleanup so retry/cancel paths detach old profile views and do not grow Auto Layout state.
    - Fixed stream error overlay attachment so repeated failures update the existing overlay instead of embedding duplicate constrained views.
    
    Crash/Concurrency Hardening
    
    - Fixed Chinstrap reachable-cache races by serializing reachable mapping/timer state and using captured identifiers.
    - Fixed VideoToolbox decoder completion/backpressure races by replacing a shared semaphore with per-waiter tracking and making completion/session-leave paths idempotent.
    - Held the VideoToolbox session lock through decoded-frame callbacks to avoid shutdown racing frame delivery.
    - Fixed SMB client cache races by serializing SMB2Manager ownership and invalidating only the manager instance that failed.
    - Fixed startup Penguin client crashes by avoiding late getPenguin() singleton force unwraps during delayed startup work.
    - Fixed stream start lifecycle races by sequencing starts, snapshotting source/profile state, and ignoring stale callbacks.
    - Fixed Krill status logging races by serializing status access and adding explicit CustomStringConvertible.
    - Hardened H.264 RTP parsing against empty payloads, zero-length STAP-A fragments, and short FU-A packets.
    - Guarded account-scoped UserDefaults access when no account/public key is active.
    - Reworked local HTTP server launch/stop lifecycle to avoid Perfect thread buildup and stale lifecycle callbacks.
    - Fixed Nest WebRTC teardown by adding explicit hangup/cleanup and guarding stale callbacks.
    - Replaced the intentional remote-admin crash with Darwin.exit(EXIT_SUCCESS) so remote quit still works without reporting as a crash.
    - Removed Penguin cache callback singleton traps by using the active client instead of getPenguin() after teardown.
    - Hardened media-layer teardown in CMCBufferView, especially around AVSampleBufferDisplayLayer, PiP, and queued decoded frames.
    - Hardened Chinstrap request resolution and member cache lifetime against duplicate/late completions.
    - Hardened Krill packet buffer indexing against stale time/index calculations and clock/state jumps.
    - Disabled AVKit automatic Now Playing updates for local iOS players to avoid MediaRemote nil-object aborts.
    - Stabilized Home reload during Chinstrap teardown by capturing the active service/client for the full reload chain.
    - Made cache path generation tolerate missing account state by using an unscoped cache directory instead of force-unwrapping public key state.
    - Fixed router timer-wheel expiration sweeps so delayed scans do not clear future timers or scan unbounded ranges.
    - Fixed AudioToolbox converter teardown and AAC packet validation so converter disposal cannot race queued conversion work.
    - Fixed Chinstrap client socket startup races by avoiding force unwraps and rejecting stale connect attempts cleanly.
    - Fixed module layout parsing for text(""), allowing empty quoted content and throwing parse errors for malformed content instead of trapping.
    Read what changed

Disclosure: Independent intel to help mobile builders succeed.

AI-powered analysis with automated quality gates, built from publicly available sources. Marlvel.ai is not affiliated with, endorsed by, or sponsored by Streamie: IP Camera Streaming, its developer, the app publisher, Apple, or Google Play. All trademarks, logos, and screenshots referenced remain the property of their respective owners.

Data licensed under CC-BY-NC 4.0