Estágio 02 · 02-17
LockedReact Native esconde plataforma. Você consegue construir apps razoáveis sem entender o que está embaixo: UIKit/SwiftUI no iOS, Android Framework + Compose no Android, lifecycles, threading, energy management, permissions, store policies. Mas quando precisa de feature platform-specific (Apple Pay nativo, ARKit, foreground service, push provisioning, MDM, deep linking confiável, biometric com Secure Enclave), ou quando RN bridge engasga sob carga, você precisa saber ler/escrever código nativo.
E em entrevista de Senior mobile, "construí com RN" é fraco. Senior conhece o que está abaixo da abstração. Apple e Google atualizam APIs todo ano; quem não acompanha as plataformas viver de SO do passado. Reactive frameworks (SwiftUI, Compose) mudaram completamente o paradigma vs imperative (UIKit, Views), entender o porquê é fundamental.
Este módulo é um mergulho seletivo em iOS Swift e Android Kotlin: não pretende formar dev nativo full-time, e sim fechar o gap entre "useo RN" e "entendo o sistema". Lifecycle, threading, memory, UI frameworks modernos, networking, persistence, permissions, push, build, app store realities.
iOS = Darwin (XNU kernel, Mach + BSD) + frameworks Apple. App roda dentro de process sandboxed, com app group de assets/data. Linguagens: Swift (preferida) e Objective-C (legado).
Lifecycle de app: application(_:didFinishLaunching...) → applicationDidBecomeActive → background → terminate. Em iOS moderno, scenes (multi-window iPad), SceneDelegate.
Limite de tempo em background: ~30s (beginBackgroundTask), tarefas longas precisam Background Tasks framework (BGAppRefreshTask, BGProcessingTask) ou BackgroundFetch legado.
UIViewController, UIView, autolayout (constraints), delegate/datasource pattern. Maturíssimo, todas APIs disponíveis.View é struct, body recomputa. Composição, @State, @Binding, @ObservedObject, @StateObject, @EnvironmentObject. Animations builtin.Hoje: SwiftUI default em new code, com fallbacks UIKit (UIViewControllerRepresentable, UIViewRepresentable) onde necessário. Apps existentes misturam.
Swift Concurrency (Swift 5.5+):
async / await.Task { ... } cria task.await. Elimina muito data race.Antes: GCD (Grand Central Dispatch), DispatchQueue.main.async, .global(qos: .userInitiated). Ainda muito código legado.
Threads em iOS: main thread pra UI. Off-main pra trabalho. Bloquear main = ANR-equivalent (watchdog mata após ~20s).
ARC (Automatic Reference Counting): compiler insere retain/release. Reference cycles são vazamentos, weak/unowned quebram (closures que capturam self). Patterns: [weak self] in guard let self else { return }.
Instruments (Xcode tool): Leaks, Allocations, Time Profiler. Sample app pra encontrar retain cycle e pegar memory growth.
Android = Linux kernel + bibliotecas C (Bionic libc) + Android Runtime (ART, antes Dalvik). Apps em Java/Kotlin compilam pra DEX (Dalvik Executable), JIT/AOT pelo ART.
Cada app é processo Linux + UID. IPC via Binder (mecanismo único Android). Activity, Service, BroadcastReceiver, ContentProvider são os 4 componentes históricos.
Lifecycle clássico: onCreate → onStart → onResume → onPause → onStop → onDestroy. Configuração change (rotação) por padrão recria activity.
ViewModels (AndroidX) sobrevivem a config change. State holder pattern.
UI:
@Composable functions, recomposition automática, remember, State, LaunchedEffect. Material 3 components.Coroutines = light threads, baseadas em suspend functions. Estruturada via CoroutineScope. Dispatchers: Main, IO, Default.
viewModelScope.launch(Dispatchers.IO) {
val data = repo.fetch()
withContext(Dispatchers.Main) { _state.value = data }
}
Flow: stream cold/hot reativo, similar a RxJava mas integrada com coroutines. StateFlow e SharedFlow pra state.
ANR (Application Not Responding) dispara se main thread fica > 5s sem responder. Causas comuns: IO em main, work pesado em main, lock contention.
Sempre I/O off-main. runOnUiThread pra atualizar view do background.
iOS: URLSession (default), Combine reactive, async/await. JSON via Codable. Alamofire é wrapper popular.
Android: OkHttp + Retrofit combo padrão. Coroutines + Moshi/kotlinx.serialization pra JSON.
Considerações: certificate pinning, retry policies, offline first, request coalescing, ETags, image caching.
iOS: Core Data (legado, abstração ORM), SwiftData (iOS 17+, novo wrapper), Realm, GRDB. UserDefaults pra config simples. Keychain pra secrets.
Android: Room (Jetpack, abstração SQLite), DataStore (config moderna), Realm. SharedPreferences (legado).
SQLite é base em ambos. Backups, migrations, encryption (SQLCipher).
Modelos opaco-pra-RN:
Info.plist description strings + runtime request via framework (PHPhotoLibrary.requestAuthorization). Negar uma vez = só Settings reabilita.requestPermissions. Granularidade mudou em cada versão (storage scoped, photo picker, posix tasks).iOS: APNs (Apple Push Notification service). Token device-specific, server envia via HTTP/2 com auth JWT. Notification Service Extension (modify payload) e Notification Content Extension (custom UI). Silent push pra wake app sem alert.
Android: FCM (Firebase Cloud Messaging). Token registra, server envia via HTTP. Tipos: notification, data. Foreground/background behavior diferente.
Limites: throttling, payload size, delivery semantics ("best effort", não garantido). Para crítico, fallback (SMS, in-app badge).
iOS: BackgroundTasks (BGAppRefreshTask, BGProcessingTask), BackgroundFetch legado. Sistema decide quando rodar baseado em behavior do user. Foreground app sem limite.
Android: WorkManager (Jetpack) pra trabalho deferred com constraints (network, charging). Foreground services pra trabalho user-visible (música, navegação). Doze mode suspende quando idle. Background limits foram apertando version-by-version.
Bundle iOS: IPA (.ipa zip). App thinning entrega só archs/assets do device. App Store Connect upload via Xcode/Transporter/xcrun altool.
Android: AAB (Android App Bundle) recomendado, Play gera APKs por device. R8 (sucessor de ProGuard) faz code shrinking, obfuscation.
CI: Xcode Cloud, Bitrise, GitHub Actions com macOS runner (iOS) ou Linux (Android).
Battery é UX: anti-pattern queimar. Patterns:
Low Data Mode (iOS), DataSaver (Android).App Store: review humano (1-2 dias usual, mais em casos), reject por privacy strings ausentes, IAP requirement em digital goods, Sign in with Apple obrigatório se outro SSO. Privacy Manifest + tracking domains required.
Play Store: review automatizado e humano, política mudando rápido (target SDK requirements, data safety form), Play Integrity API pra detectar tampering.
myapp://) ainda usados, menos seguros (qualquer app reivindica).Você precisa, sem consultar:
async/await, actors, Sendable.Construir app nativo iOS + Android que consome a API da Logística (do CAPSTONE-plataforma).
iOS app (Swift + SwiftUI, Xcode 15+):
CLLocationManager (significant change). Push pro server quando muda.https://logistica.example.com/orders/:id abre detalhe.Android app (Kotlin + Compose, AGP 8+):
Common: