mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-09-28 04:48:58 +00:00
Follow-up to "Recognise wrong QR code type in every scanner", from an iOS review of that commit. - ScanProtocolServer: a rejected scan now alerts in place instead of dismissing, but the sheet had no way out - move its title into the nav bar and add a Cancel button. Fixes the preview, which needs AppTheme now that the themed background is applied inside the view. - MigrateToDevice: classify the pasted link off the main thread, as the Kotlin paste path already does - pasted text is unbounded and classifying a file link parses its YAML description. Guard the result, as the sheet can be dismissed while classifying. - Relay message named the Chat relay screen but not that the address is only kept once the relay is tested, so following it lost the pasted address to an "Invalid relay name!" alert. The migration message named a label that only exists on desktop. - ContentView: the /r deep link showed the relay alert without the guidance added to the other call site; both literals were identical before. - Document WrongQRCode.swift per apps/ios/CODE.md, and refresh the specs and product docs that quote the changed messages.
SimpleX Chat iOS -- Specification Overview
Technical specification suite for the SimpleX Chat iOS application. Each document provides bidirectional links to product documentation and source code.
Executive Summary
The SimpleX Chat iOS app is a native SwiftUI frontend that communicates with a Haskell core library via C FFI. All chat logic, encryption, protocol handling, and database operations happen in the Haskell core (chat_ctrl). The iOS layer handles UI rendering, system integration (CallKit, Push Notifications, Background Tasks), local preferences, and theming. The app shares its database with a Notification Service Extension (NSE) for decrypting push payloads while the main app is inactive.
Dependency Graph
SimpleXApp (root entry point)
├── ChatModel (ObservableObject state) <-> SimpleXAPI (FFI bridge) <-> Haskell Core (chat_ctrl)
├── Views (SwiftUI)
│ ├── ChatListView -> ChatView -> ComposeView
│ ├── ChatItemView (renders individual messages)
│ ├── Settings, UserProfiles, Onboarding
│ └── ActiveCallView (WebRTC + CallKit)
├── Models
│ ├── ChatModel (global app state -- singleton)
│ ├── ItemsModel (per-chat message list state -- singleton + secondary instances)
│ ├── ChatTagsModel (tag filtering state)
│ └── Chat (per-conversation observable state)
├── Services
│ ├── NtfManager (push notification coordination)
│ ├── BGManager (background task scheduling)
│ ├── CallController (CallKit + VoIP push)
│ └── ThemeManager (theme resolution engine)
└── Extensions
├── SimpleX NSE (Notification Service Extension -- decrypts push payloads)
└── SimpleX SE (Share Extension)
Specification Documents
| Document | Description |
|---|---|
| Architecture | System architecture, FFI bridge, app lifecycle, extension model |
| Chat API Reference | Complete ChatCommand, ChatResponse, ChatEvent, ChatError type reference |
| State Management | ChatModel, ItemsModel, Chat, ChatInfo, preference storage |
| Database & Storage | SQLite databases, encryption, file storage, export/import |
| Chat View | Message rendering, chat item types, context menu actions |
| Chat List | Conversation list, filtering, search, swipe actions |
| Message Composition | Compose bar, attachments, reply/edit/forward modes, voice recording |
| Navigation | Navigation stack, deep linking, sheet presentation, call overlay |
| Push Notifications | NtfManager, NSE, notification modes, token lifecycle |
| WebRTC Calling | CallController, WebRTCClient, CallKit, signaling via SMP |
| File Transfer | Inline/XFTP transfer, auto-receive, CryptoFile, file constants |
| Theme Engine | ThemeManager, default themes, customization layers, wallpapers |
| Impact Graph | Source file → product concept mapping, risk levels |
Related Product Documentation
Source Code Entry Points
| File | Role |
|---|---|
Shared/SimpleXApp.swift |
App entry point, Haskell init, lifecycle management |
Shared/AppDelegate.swift |
UIApplicationDelegate for push token registration |
Shared/ContentView.swift |
Root view -- authentication gate, call overlay, navigation |
Shared/Model/ChatModel.swift |
Primary observable state (ChatModel, ItemsModel, Chat) |
Shared/Model/SimpleXAPI.swift |
FFI bridge -- chatSendCmd, chatApiSendCmd, sendSimpleXCmd |
Shared/Model/AppAPITypes.swift |
ChatCommand, ChatResponse, ChatEvent enums (iOS app layer) |
SimpleXChat/APITypes.swift |
APIResult, ChatError, ChatCmdProtocol (shared framework) |
SimpleXChat/ChatTypes.swift |
User, ChatInfo, Contact, GroupInfo, ChatItem data types |
SimpleXChat/SimpleX.h |
C header for Haskell FFI functions |