Razvoj mobilnih aplikacija za iOS i Android

Razvoj mobilnih aplikacija je mnogo više od toga da web stranicu stavite u ikonicu na početnom ekranu. Dobra aplikacija se otvara odmah, radi i na slabom signalu, šalje pravu notifikaciju u pravi trenutak, prolazi Appleovu i Googleovu recenziju iz prvog pokušaja i nastavlja da radi i poslije sljedećeg izdanja iOS-a i Androida. Da bi sve to stajalo na mjestu, treba razmišljati o proizvodu, solidno napisati frontend i izgraditi backend koji podnosi klijente koji su offline, zastarjeli ili na drugom kraju svijeta.

U CodeWizu razvoj mobilnih aplikacija pokriva cross-platform aplikacije u React Nativeu i Flutteru, nativne aplikacije u Swiftu i Kotlinu kada proizvod to traži, te API-je, baze podataka i infrastrukturu iza njih. Pošto smo full-stack tim, aplikacija, backend i deployment pipeline nastaju zajedno, a ne tako što ih tri različita dobavljača naknadno spajaju.

Usluga razvoja mobilnih aplikacija namijenjena je startupima koji provjeravaju proizvod, kompanijama koje uz postojeći web shop ili platformu žele aplikaciju za kupce, i timovima kojima treba interna aplikacija za teren, dostavu ili inspekcije. Ako već imate aplikaciju koja puca, kasni ili stalno biva odbijena na recenziji, možemo je preuzeti, stabilizovati i nastaviti dalje.

Android: Programer mobilnih aplikacija kuca na laptopu, pored telefona i kafe na drvenom stolu

React Native i Flutter aplikacije: jedan kod za iOS i Android

Cross-platform frameworki omogućavaju jednom timu da iz jedne baze koda objavi aplikaciju u obje prodavnice. Za većinu poslovnih aplikacija – kataloge, rezervacije, programe lojalnosti, kontrolne table, marketplace i alate za teren – to je najisplativiji put, jer se funkcionalnosti, ispravke i testovi pišu jednom.

React Native uz Expo

React Native crta prave nativne komponente interfejsa i piše se u TypeScriptu, pa se mogu iskoristiti web programeri i postojeći React kod. Otkad je New Architecture (Fabric renderer, TurboModules i JSI) postala podrazumijevana, staro usko grlo bridgea više ne postoji, a nativni moduli se pozivaju brže. React Native aplikacije gradimo na Expo platformi, koja daje EAS Build za buildove u oblaku i potpisivanje, EAS Submit za slanje u prodavnice i EAS Update za over-the-air ispravke JavaScript sloja, bez čekanja na novo izdanje u prodavnici.

Flutter

Flutter koristi Dart i sam crta svaki piksel preko Impeller rendering enginea. Zato interfejs izgleda isto na svakom uređaju, a jako animirani ili posebno brendirani ekrani postaju jednostavniji. Flutter je dobar izbor kada je dizajn daleko od podrazumijevanog izgleda platforme, kada želite i desktop ili ugrađene mete, ili kada vaš tim već zna Dart.

Šta dobijate

  • Bazu koda u TypeScriptu ili Dartu sa jasnom strukturom: navigacija, upravljanje stanjem (Zustand, TanStack Query, Riverpod ili Bloc), sloj za API i design tokeni.
  • Nativne detalje tamo gdje su bitni: sistemski share sheet, haptika, biometrijska prijava, deep linkovi i widgeti.
  • Automatske testove (Jest, React Native Testing Library, Flutter widget testovi, Maestro za end-to-end tokove) koji rade u CI-ju.
  • Izvještavanje o padovima i praćenje performansi preko Sentryja ili Firebase Crashlyticsa, od prvog builda.

Nativni iOS i Android razvoj u Swiftu i Kotlinu

Nativni razvoj znači dvije baze koda: Swift sa SwiftUI na iOS-u i Kotlin sa Jetpack Composeom na Androidu. Košta više, ali je i dalje pravi odgovor u nekoliko situacija:

  • Dubok pristup hardveru: Bluetooth Low Energy uređaji, NFC, lokacija u pozadini, obrada kamere i zvuka.
  • Proširenja platforme kao što su Apple Watch aplikacije, widgeti, App Clips, CarPlay, Android Auto ili Wear OS.
  • Aplikacije kod kojih je bitna svaka milisekunda pokretanja i svaki kadar animacije.
  • Proizvodi kod kojih je izgled i osjećaj platforme prodajna prednost, a nove mogućnosti operativnog sistema treba uvesti istog dana.

Postoji i srednji put: Kotlin Multiplatform dijeli poslovnu logiku između iOS-a i Androida, a interfejs ostaje potpuno nativan. Postojeća nativna aplikacija može ugraditi React Native ili Flutter ekrane za nove funkcionalnosti. Pišemo i nativne module za cross-platform aplikacije kada ne postoji biblioteka za konkretan SDK ili uređaj.

Poređenje opcija za razvoj mobilnih aplikacija

Ne postoji framework koji je najbolji za sve. Tabela ispod sažima kompromise o kojima razgovaramo sa klijentima prije nego što napišemo ijednu liniju koda:

PristupJezikDijeljenje kodaPerformanseNajbolje zaNa šta paziti
React Native (Expo)TypeScriptVisoko, uz ponovnu upotrebu web logikeBlizu nativnih za uobičajene poslovne aplikacijeTimove sa React znanjem i aplikacije koje se brzo mijenjajuKvalitet nativnih biblioteka trećih strana varira
FlutterDartVrlo visoko, uključujući UIBlizu nativnih, glatke prilagođene animacijeJako brendirani UI i više platformiUI ne prati podrazumijevani izgled platforme sam od sebe
Nativno (Swift, Kotlin)Swift, KotlinNema (dvije baze koda)Najbolje mogućeAplikacije vezane za hardver i proširenja platformeOtprilike dvostruko više posla za funkcionalnosti i testove
Kotlin MultiplatformKotlin, Swift za iOS UIDijeljena poslovna logikaNativni UINativne timove koji žele manje dupliranjaManji ekosistem, iOS alati još sazrijevaju
Progressive Web AppJavaScriptDijeljeno sa web stranicomDobre, uz ograničene API-je uređajaSadržaj i jednostavne alate bez prisustva u prodavniciOgraničen rad u pozadini, posebno na iOS-u

Za novu poslovnu aplikaciju najčešće preporučujemo React Native uz Expo, osim kada dizajn, hardver ili vaš postojeći tim jasno vode u drugom pravcu.

Objava u App Storeu i Google Playu bez iznenađenja

Mnogi koji prvi put objavljuju aplikaciju prekasno otkriju da je objava projekat za sebe. Mi vodimo cijeli proces i naloge otvaramo na ime vaše kompanije, tako da vi posjedujete listing, ključeve za potpisivanje i recenzije.

Apple App Store

  • Članstvo u Apple Developer Programu (99 USD godišnje) i, za kompanije, D-U-N-S broj za organizacioni nalog.
  • Oznake privatnosti (privacy nutrition labels), privacy manifest za aplikacije i SDK-ove koji koriste osjetljive API-je, te brisanje naloga unutar aplikacije ako korisnici mogu da otvore nalog.
  • Beta testiranje preko TestFlighta, zatim recenzija prema App Store Review Guidelines. Većina recenzija se završi za dan-dva. Odbijanja se najčešće tiču nedostajućih podataka za prijavu recenzenta, nedovršenih funkcionalnosti ili digitalne robe koja se prodaje mimo in-app purchasea.

Google Play

  • Jednokratna registracija programera od 25 USD, provjera identiteta i popunjen Data safety obrazac.
  • Novi lični nalozi programera moraju odraditi zatvoreni test sa najmanje 12 testera tokom 14 dana prije pristupa produkciji. Organizacioni nalozi su izuzeti.
  • Android App Bundle potpisan preko Play App Signinga, target API nivo koji Google podiže svake godine, i postepeno puštanje koje kreće od malog procenta korisnika.

Listing u prodavnici i upravljanje izdanjima

Pripremamo snimke ekrana za svaku traženu veličinu uređaja, opise sa ključnim riječima (app store optimizacija), lokalizovane listinge i napomene uz izdanje. CI šalje buildove kroz interni, beta i produkcijski kanal preko Fastlanea ili EAS Submita.

Mobilni backend i API-ji napravljeni za aplikacije

Mobilni backend ima zahtjeve koje backend web stranice često nema. Stare verzije aplikacije ostaju instalirane mjesecima, mreža prekine zahtjev na pola, a svaki ekran treba da se učita uz što manje krugova do servera. Mobilne backende gradimo u Laravelu ili Node.js-u, na PostgreSQL-u ili MySQL-u, uz Redis za keširanje i redove.

  • Verzionisani API-ji: REST ili GraphQL endpointi koji ostaju unazad kompatibilni, plus provjera minimalne verzije koja može zamoliti korisnika da ažurira aplikaciju kada stari build mora da se povuče.
  • Autentifikacija: OAuth 2.0 sa PKCE, kratkotrajni access tokeni i refresh tokeni u iOS Keychainu ili Android Keystoreu, te Sign in with Apple i Google tamo gdje olakšavaju registraciju.
  • Odgovori krojeni za ekrane: paginacija, izbor polja i promjena veličine slika preko CDN-a, da lista proizvoda ne skida fotografije u desktop veličini.
  • Zaštita: rate limiting, validacija zahtjeva i otkrivanje zloupotrebe – isti principi kao u našem vodiču za API rate limiting.
  • Plaćanja: Apple i Google in-app purchase za digitalnu robu, te Stripe ili PayPal za fizičku robu i usluge, po istoj praksi kao naš rad na integraciji payment gatewaya.

Firebase ili Supabase mogu ubrzati MVP i koristimo ih kada odgovaraju. Kada su poslovna pravila složena, kada treba povezati postojeće sisteme ili kada podaci moraju ostati u određenoj zemlji, prilagođeni API je vremenom obično jeftiniji i fleksibilniji.

Dvije ruke drže pametni telefon ispred zamućenih svjetala grada

Push notifikacije i offline sync na koji se korisnik može osloniti

Push notifikacije koje ljudi ostave uključene

Svaka notifikacija ide preko Apple Push Notification service (APNs) na iOS-u ili Firebase Cloud Messaginga (FCM) na Androidu. I iOS i, od Androida 13, Android traže dozvolu korisnika, pa je tražimo u trenutku koji ima smisla, a ne na prvom pokretanju. Na iOS-u razmatramo i provisional notifikacije. Tipična FCM HTTP v1 poruka nosi i vidljivu notifikaciju i podatke za deep link:

{ "message": { "token": "DEVICE_TOKEN", "notification": { "title": "Order shipped", "body": "Your order #1042 is on its way" }, "data": { "type": "order", "orderId": "1042" }, "android": { "priority": "high", "notification": { "channel_id": "orders" } }, "apns": { "payload": { "aps": { "sound": "default", "badge": 1 } } } } }

Na backendu čuvamo tokene uređaja po korisniku i platformi, nevažeće automatski uklanjamo, slanje ide kroz red da kampanje nikada ne blokiraju API, a korisnik bira kategorije (narudžbe, poruke, promocije).

Offline-first podaci i sinhronizacija

Offline podrška je odluka u dizajnu, a ne biblioteka koja se doda na kraju. Na uređaju držimo lokalnu bazu (SQLite preko Expo SQLite, op-sqlite ili Drift, WatermelonDB, Room ili SwiftData) i mrežu tretiramo kao način sinhronizacije, a ne kao uslov da se podaci uopšte prikažu. Izmjene idu u outbox i šalju se uz idempotency ključ, tako da ponovljeni zahtjev nikada ne pravi duplikat:

async function flushOutbox() { for (const job of await db.outbox.all()) { const res = await fetch(`${API_URL}/sync`, { method: "POST", headers: { "Content-Type": "application/json", "Idempotency-Key": job.id }, body: JSON.stringify(job.payload), }); if (res.ok) await db.outbox.remove(job.id); else if (res.status === 409) await resolveConflict(job, await res.json()); else break; } }

Konflikte rješavamo pravilima dogovorenim sa vama: posljednji upis pobjeđuje za jednostavna polja, server je mjerodavan za cijene i zalihe, a za zajedničke podatke ide spajanje. Sinhronizacija u pozadini ide preko WorkManagera na Androidu i BGTaskSchedulera na iOS-u. Sync engine poput PowerSynca je opcija kada je model podataka velik.

Sigurnost mobilne aplikacije

Binarni fajl aplikacije je u rukama svakog korisnika, pa i onih radoznalih. Kao kontrolnu listu pratimo OWASP Mobile Application Security Verification Standard (MASVS):

  • Nema API tajni u paketu aplikacije – sve što je u binarnom fajlu može se izvući, pa osjetljive operacije ostaju na serveru.
  • Tokeni u sigurnom skladištu, TLS svuda, a certificate pinning za aplikacije visokog rizika kao što su finansije ili zdravstvo.
  • Play Integrity API i Apple App Attest da automatska zloupotreba vašeg API-ja bude teža.
  • Obfuskacija preko R8 na Androidu, skeniranje zavisnosti u CI-ju i minimalne dozvole, svaka obrazložena u listingu prodavnice.

Česte greške u mobilnim aplikacijama koje ispravljamo

  • Traženje dozvola za notifikacije, lokaciju i praćenje na prvom pokretanju, prije nego što korisnik vidi bilo kakvu vrijednost.
  • API-ji koji lome stare verzije aplikacije, pa korisnici koji nisu ažurirali odjednom vide greške.
  • Nema izvještaja o padovima ni analitike, pa se problemi otkrivaju kroz recenzije sa jednom zvjezdicom.
  • Ključevi za potpisivanje i nalozi prodavnice na ime bivšeg frilansera, umjesto na kompaniju.
  • Učitavanje slika u punoj veličini i lista bez paginacije, što troši bateriju i mobilne podatke.
  • Testiranje samo na najnovijem vrhunskom telefonu, nikada na starijem Androidu srednje klase.

Razvoj mobilnih aplikacija: šta utječe na cijenu

Procjenu dajemo poslije kratke faze upoznavanja, a ne samo na osnovu liste funkcionalnosti. Glavni faktori su:

  • Broj ekrana, uloga korisnika i tokova, te koliko je dizajn prilagođen.
  • Cross-platform ili nativno, i da li su u obimu tableti, satovi ili widgeti.
  • Da li backend već postoji ili ga treba izgraditi, i koji sistemi (ERP, CRM, provajderi plaćanja) moraju biti povezani.
  • Zahtjevi za offline rad i funkcionalnosti u realnom vremenu, kao što su chat ili praćenje uživo.
  • Potrebe za sigurnošću i usklađenošću, te nivo održavanja poslije objave.

Aplikacije zapravo nikada nisu gotove: Apple i Google svake godine izdaju velika izdanja operativnog sistema, a zahtjevi prodavnica se mijenjaju zajedno sa njima. Održavanje planiramo od prvog dana, a naš pristup vrhunskom razvoju bez vrhunskih cijena drži to održivim.

Dvije osobe planiraju za stolom u kafiću uz rokovnik, telefon i tablet

Kako radimo

  1. Upoznavanje: razjašnjavamo korisnike, glavne tokove, poslovne ciljeve i sisteme na koje se aplikacija mora povezati, i preporučujemo framework.
  2. Dizajn i prototip: wireframeovi i prototip na koji se može kliknuti, koji možete isprobati na svom telefonu prije nego što krene razvoj.
  3. Izgradnja: razvoj u kratkim iteracijama, uz redovne TestFlight i Play interne buildove, zajedno sa backendom i API-jima.
  4. Testiranje: automatski testovi, end-to-end tokovi u Maestru i ručno testiranje na pravim iOS i Android uređajima, uključujući starije modele.
  5. Objava: listing u prodavnici, slanje na recenziju i postepeno puštanje uz praćenje padova i performansi.
  6. Podrška: ažuriranja operativnog sistema i SDK-ova, promjene zahtjeva prodavnice, nove funkcionalnosti i over-the-air ispravke tamo gdje su dozvoljene.

Zašto CodeWiz

  • Aplikacija i backend u jednom timu: gradimo mobilnu aplikaciju, API, bazu podataka i servere, tako da se ništa ne izgubi između dobavljača.
  • Iskren izbor tehnologije: React Native, Flutter, nativno ili čak PWA – preporučujemo ono što odgovara vašem proizvodu, a ne ono što nama slučajno više leži.
  • Open-source na prvom mjestu: Expo, Laravel, Node.js i PostgreSQL vas ne vežu za dobavljača, a vi posjedujete sav kod, naloge i ključeve.
  • Performanse i sigurnost od početka: isti tim koji web stranice dovozi do 100/100 na PageSpeedu i ojačava servere radi i na vašoj aplikaciji.
  • Poštene cijene: vrhunski razvoj bez vrhunskih cijena, iz Banje Luke, na daljinu sa klijentima lokalno i međunarodno – više pročitajte o CodeWizu.

Često postavljana pitanja

Koliko košta razvoj mobilnih aplikacija?

Zavisi od broja funkcionalnosti, dizajna, backenda i integracija. Fokusirani MVP sa nekoliko glavnih ekrana je sasvim drugi projekat od marketplacea sa plaćanjima, chatom i offline režimom. Poslije upoznavanja dajemo jasnu procjenu, raščlanjenu po funkcionalnostima, da možete odlučiti šta ulazi u prvo izdanje.

Koliko traje izrada aplikacije?

Fokusirani MVP obično traje nekoliko mjeseci od upoznavanja do objave u prodavnici, dok se veći proizvodi isporučuju u fazama. Sama recenzija prodavnice je brza, ali novi lični Google Play nalog dodaje period zatvorenog testiranja.

Da li izabrati React Native ili Flutter?

Oba su zrela i spremna za produkciju. React Native odgovara timovima sa JavaScript ili React iskustvom i aplikacijama koje dijele logiku sa web platformom. Flutter odgovara jako prilagođenim interfejsima bogatim animacijama. Za većinu poslovnih aplikacija oba rade dobro, a kompromise objašnjavamo na vašem konkretnom slučaju.

Da li mi treba nativna aplikacija ili je dovoljan PWA?

Ako vam treba prisustvo u prodavnici, pouzdane push notifikacije na iOS-u, zadaci u pozadini ili mogućnosti uređaja kao što je Bluetooth, bolji izbor je nativna ili cross-platform aplikacija. Za sadržaj i jednostavne alate, progressive web app može biti jeftiniji i brži za objavu.

Ko je vlasnik aplikacije i izvornog koda?

Vlasnik ste vi. Objavljujemo pod vašim nalozima programera, predajemo repozitorijum, ključeve za potpisivanje i dokumentaciju, a vi možete nastaviti sa nama ili sa bilo kojim drugim timom.

Možete li preuzeti postojeću aplikaciju?

Da. Krećemo od audita koda i infrastrukture, ispravljamo padove i zastarjele zavisnosti, ažuriramo aplikaciju na trenutne zahtjeve prodavnice, a zatim nastavljamo sa novim funkcionalnostima.

Spremni da izgradite mobilnu aplikaciju?

Recite nam šta aplikacija treba da radi i ko će je koristiti, a mi ćemo predložiti tehnologiju, obim i rok. Javite nam se da razgovaramo o ideji, ili pogledajte sve naše usluge razvoja.