Arquitetura iOS
Swift · UIKit · MVC + Service
Stack técnico do app iOS: linguagens, dependências, organização em camadas, padrões de rede e persistência usados pelas telas listadas em Visão Geral iOS.
Stack
| Camada | Tecnologia | Observações |
|---|---|---|
| Linguagem | Swift 5+ | Bridging header presente para integrações Obj-C pontuais. |
| UI | UIKit + Storyboards + XIBs | Telas em Base.lproj/*.storyboard e XIBs avulsos por feature. |
| Arquitetura | MVC com Service / Model por feature | Ex.: SistemicListViewController + SistemicListService + SistemicModels. |
| Gerenciador de pacotes | CocoaPods | Podfile e Pods/ versionados; ambiente fixo pelo Podfile.lock. |
| Mapa | MapKit (nativo) | Implementação iOS do módulo Mapa — equivalente a OSMDroid no Android. |
| Rede HTTP | URLSession | Clientes por feature (SistemicHttpClient, ElasticsearchService, etc.). |
| Realtime | TCPClient + WebSocketService | TCP para protocolo MONIAPP (rastreador); WebSocket para eventos do backend. |
| Push / Analytics | Firebase (FCM) + GoogleService-Info.plist | Tokens FCM enviados para o backend após login. |
| Background | BGTaskScheduler + Background Modes | Definido em AppMonisatIos.entitlements. |
| Fontes / ícones | FontAwesome (.ttf) + Glyphter | Arquivos fa-*.ttf e Glyphter.ttf no bundle. |
Camadas de uma feature típica
1
ViewController
Recebe input do usuário, configura UI e delega ao Service. Geralmente armazena estado mínimo (DataSource de UITableView/UICollectionView).
2
Service
Chamadas HTTP com URLSession, parsing JSON com Codable e regras de negócio. Ex.: SistemicListService.swift, ElasticsearchService.swift, FuncService.swift.
3
Model
Structs Codable refletindo a forma do JSON v1 (sempre desempacotar wrapper data). Ex.: SistemicModels.swift, HistoricModels.swift, GridModels.swift.
4
Helpers / Cells
Lógica de apresentação isolada: GridHelpers.swift, DisregardCell.swift, EventCell.swift.
Persistência
| Mecanismo | Uso |
|---|---|
UserDefaults | JWT, user_id, company_id, flags master/driver, perms_user — equivalente ao SharedPreferences do Android. |
Keychain | Credenciais sensíveis para biometria. |
FileManager (Documents) | Cache offline de listas (viagens, veículos, notificações). |
Padrões de Rede v1
Todas as chamadas v1 exigem header
Authorization: Bearer <jwt>. O wrapper { "data": ... } deve ser desempacotado em cada parser. Endpoints legados (api.monisat.online) ainda usam Client-Id / User-Id / Token — ver Autenticação.
struct ApiEnvelope<T: Decodable>: Decodable {
let data: T
}
func get<T: Decodable>(_ path: String, completion: @escaping (Result<T, Error>) -> Void) {
var req = URLRequest(url: URL(string: baseURL + path)!)
req.setValue("Bearer \(jwt)", forHTTPHeaderField: "Authorization")
URLSession.shared.dataTask(with: req) { data, _, err in
guard let data = data, err == nil else { return completion(.failure(err!)) }
do {
let env = try JSONDecoder().decode(ApiEnvelope<T>.self, from: data)
completion(.success(env.data))
} catch { completion(.failure(error)) }
}.resume()
}
Capabilities / Entitlements
| Capability | Para quê |
|---|---|
| Push Notifications | FCM via APNs — Home e Notificações. |
| Background Modes (location, fetch, processing) | Rastreador GPS, BGTaskScheduler, atualizações periódicas. |
| Keychain Sharing | Persistência segura entre sessões. |
| Sign In with Apple | Opção alternativa de login (quando habilitada). |