API v1

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

CamadaTecnologiaObservações
LinguagemSwift 5+Bridging header presente para integrações Obj-C pontuais.
UIUIKit + Storyboards + XIBsTelas em Base.lproj/*.storyboard e XIBs avulsos por feature.
ArquiteturaMVC com Service / Model por featureEx.: SistemicListViewController + SistemicListService + SistemicModels.
Gerenciador de pacotesCocoaPodsPodfile e Pods/ versionados; ambiente fixo pelo Podfile.lock.
MapaMapKit (nativo)Implementação iOS do módulo Mapa — equivalente a OSMDroid no Android.
Rede HTTPURLSessionClientes por feature (SistemicHttpClient, ElasticsearchService, etc.).
RealtimeTCPClient + WebSocketServiceTCP para protocolo MONIAPP (rastreador); WebSocket para eventos do backend.
Push / AnalyticsFirebase (FCM) + GoogleService-Info.plistTokens FCM enviados para o backend após login.
BackgroundBGTaskScheduler + Background ModesDefinido em AppMonisatIos.entitlements.
Fontes / íconesFontAwesome (.ttf) + GlyphterArquivos 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

MecanismoUso
UserDefaultsJWT, user_id, company_id, flags master/driver, perms_user — equivalente ao SharedPreferences do Android.
KeychainCredenciais 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

CapabilityPara quê
Push NotificationsFCM via APNs — Home e Notificações.
Background Modes (location, fetch, processing)Rastreador GPS, BGTaskScheduler, atualizações periódicas.
Keychain SharingPersistência segura entre sessões.
Sign In with AppleOpção alternativa de login (quando habilitada).