Razvoj mobilnih aplikacija: iOS ili Android?

Pokrećete vaš novi super startap? Znate da je mobilni nastup neophodan, ali da li se odlučiti za razvoj za iOS ili za Android? To pitanje muči sve više ljudi. Programersko znanje i iskustvo svih nas se razlikuju, neki dolaze iz C/C++ jezika, neki iz Jave, C# a tu su naravno i PHP, Ruby i slični

Vuk Nikolić
28/05/2012

Pokrećete vaš novi super startap? Znate da je mobilni nastup neophodan, ali da li se odlučiti za razvoj za iOS ili za Android? To pitanje muči sve više ljudi. Programersko znanje i iskustvo svih nas se razlikuju, neki dolaze iz C/C++ jezika, neki iz Jave, C# a tu su naravno i PHP, Ruby i slični jezici.

Preneću vam svoja viđenja kao Java programer koji je prešao na Android, a potom na iOS development.

Računar i početni setup

Pre nego što počnemo razvoj za neku od ovih platformi prvo treba da pogledamo šta nam je potrebno od hardvera.

Već ovde se vide razlike između platformi i one mogu da prelome odluku. Dakle, za iOS razvoj je neophodan Apple računar, dok je za Android dovoljan bilo koji (Windows, Linux, Mac OSX), osim Solarisa.

Uređaji i njihove rezolucije

Veoma dobra stvar za razvoj iOS aplikacija je to što je u igri mali broj tipova uređaja. To su iPhone, iPad i iPod Touch. Ali to nisu sve dobre stvari. iPhone do verzije 4 ima rezoluciju od 320x480px, a od verzije 4 ima duplo veću 640x960px (Retina Display). Sa druge strane iPad do verzije 3 ima rezoluciju od 768×1024, a od verzije 3 ima takođe duplo veću 1536×2048.

Zašto je to dobro? To omogućava developeru da radi kao da postoji jedna verzija, odnosno jedna rezolucija, što je fantastično – aplikacija će izgledati identično na svakom uređaju.

Ne bih to toliko isticao da na drugoj strani nije potpuno obrnuta situacija. Kod Androida imamo ogroman broj telefona, tableta i ko zna čega još.

Ne samo da postoje različiti proizvođači (Samsung, HTC, Sony, LG…), već svaki od njih ima svoje dimenzije ekrana, svoje rezolucije i gustine piksela. Takva odluka je super za korisnike mobilnih telefona jer otvara mogućnost da se nađu uređaji za svačiji džep.

Za developere je ipak druga priča, pošto je potrebno prilagoditi kod za sve te ekrane i rezolucije.

Srećom, na Androidu situacija nije baš toliko loša. Dobri ljudi iz Open Handset Alliance-a su smislili način kako da sve sličice i lejautove postavimo za određene veličine ekrana.

Razvojna okruženja

Kako god da se okrene, najveći deo vremena programeri provode ispred monitora u nekom okruženju gde kucaju kod. Zato smatram da je razvojno okruženje (IDE) vrlo bitna stavka svake platforme.

Za iOS, priča je slična kao i u prethodnim stavkama. Dakle, postoji jedno okruženje pod imenom Xcode koji razvija Apple.

Ovo je veoma brzo okruženje (u smislu vremena da se pokrene – ko je radio sa Java okruženjima umeće ovo da ceni). Ali ne samo da se brzo otvara, već samo po sebi dosta brzo radi, promena fajlova, tabova i slične akivnosti se obavljaju veoma brzo.

Mana je što mi se čini da je dosta manje stabilno od Java okruženja, a ume da bude vrlo iritantno kada se iz čista mira zatvori u sred nekog posla. Moram ovde da se ogradim da se to ne dešava toliko često, ali nekako uvek ubode trenutak kada mi je to najmanje potrebno.

Pored brzine, Xcode ima odličan GUI editor (o kome će biti reči kasnije), kao i rad sa bazom. Super je to što se entiteti prave na dijagramima, gde se vidi njihov međusobni odnos.

Moram da spomenem i AppCode. Primetio sam da ga većina iOS developera ne voli, ali meni se dosta sviđa. Nažalost nije besplatno okruženje, i nije zamena za Xcode (GUI mora da se radi u njemu), ali je po raznim kriterijumima naprednije okruženje od Xcode-a (možda zato što je nastalo od Java okruženja :D #jkfanbois).

Java okruženja

Jedna od stvari koja svakako prati Java zajednicu je ogroman izbor. I to izbor u svemu, samim tim i okruženjima za razvoj. Priča o tome koje od Java okruženja je bolje nikada ne bi imala kraj, ipak odlično je što programeri ovde imaju veliki izbor i svako može da nađe ono što mu/joj odgovara.

Najpopularniji su Eclipse, Netbeans i IDEA Intellij. Sada će verovatno neko odmah da skoči da kaže da Intellij nije besplatan. Ovo jeste tačno, ali samo donekle – za Android razvoj postoji besplatna, potpuno funkcionalna verzija.

Ono što odlikuje ova okruženja u odnosu na Xcode je to što su dosta “pametnija”. Tu je odličan code complete, refactoring i debugger. Meni se oni čine kao tri velika argumenta za Java okruženja.

Code complete ne služi samo da okruženje nastavi ime započete metode (npr), već da se iz konteksta vidi šta je programer hteo da napiše, poput:


Ovde je okruženje samo zaključilo da do instance klase Project možemo doći preko getModule() ili preko myModule. Odlično, zar ne?

Refactoring u ovim alatima je za klasu iznad Xcode (u kom mi se dešavalo da ne odradi svuda promenu imena, biće da je to do prirode jezika kao što je Objective C).

Debugger je takođe, daleko ispred. Jedna od mojih najvećih frustracija u početku sa iOS je upravo bio debuger, ali ako bih nastavio više bih blatio Xcode nego što bih hvalio Java okruženja. :)

Takođe, veoma je dobro što su sva pomenuta okruženja prepuna plaginova. Moguće je naći plagin za gotovo sve što vam padne na pamet. Na primer integracija sa raznim servisima (od version control systema kao što su svn, git, do issue trackera trac, bugzilla, kao i UML dijagrama i ko zna čega već sve).

Simulator i emulator

Logično je da u početnom delu razvoja tim nema baš sve uređaje na kojima treba da bude implementirana aplikacija. Zato postoje sa jedne strane simulator, a sa druge emulator. Suština im je ista – omogućavaju nam da pokrenemo aplikaciju bez fizičkog uređaja. Razlika je samo u načinu na koji to rade.

Emulator pokušava da učini da se virtuelni uređaj ponaša kao pravi uređaj i u softverskom i hardverskom smislu, dok simulator to radi samo za softverski deo (moj pokušaj definicije u jednoj rečenici).

Možda će biti lakše uz ova dva konkretna primera.

iPhone ima simulator, dok Android ima emulator. U slučaju iPhone simulatora, vi možete videti da on ima hard disk koliko i vaš Mac računar na primer, dok emulator navodi realne cifre. Takođe teško ćete dobiti memory warning (da je prevelika potrošnja memorije) na simulatoru, dok je na emulatoru sve moguće.

Sa druge strane simulator se neverovatno brzo pokreće, dok kod Android emulatora to ume da potraje (nešto poput startovanja virtualne mašine unutar VirtualBoxa ili VMware-a).

Zbog ujednačene rezolucije na iPhone-u sve što napravite u simulatoru će gotovo sigurno izgledati isto i na uređaju, dok kod Androida imate tu lepu mogućnost da napravite više različitih emulatora za svaku rezoluciju koja vam je potrebna.

Jezik kojim pričaju

Odlučujući faktor može biti jezik koji se koristi za razvoj aplikacija. Kao Java developer nisam imao nikakav problem sa razvojem za Android. Osećaj je bio kao da sam kod kuće. Tu je bio novi API koji treba savladati i to je bilo to.

Objective C

Objective C je potpuno novi jezik pa je i učenje bilo duže. Tako da ovde ne mogu baš objektivno da pričam, pošto ipak imam jak Java “akcenat”.

Siguran sam da će svaki Java/.NET/PHP/Ruby developer da pomisli kada vidi Objective C da je neverovatno da mora da se vodi briga o memoriji.

Ali, ono što je interesantno je da Objective C nema kao npr. C++ new i delete model, već reference counting model gde moramo da brojimo reference ka objektu koji koristimo. Čak je i to pojednostavljeno, kada nam treba neki objekat kažemo mu retain, a kada ne treba release. To je sve.

Međutim, fini ljudi iz Applea su se dosetili da kada već Analyzer koda (alat unutar Xcode-a) može da konstatuje kada imamo memory leak, da bi to bi mogao i sam kompajler. I tako od verzije iOS 4.3 moguće je koristi ARC (Automatic Reference Counting). Time smo pošteđeni retaina i releasea, ali mislim da je svakako potrebno poznavati ovaj model koji je u pozadini svega.

Druga interesantna stvar je da Objective C koristi razmenu poruka, umesto poziva metoda. Iskusniji programeri kažu da je to model iz Smalltalka. To znači da vi možete poslati poruku nekom objektu, ali ne znači da on prima te poruke.

Definitivno stvar koja me je najviše u početu bunila je definisanje metode, kao i poziv same metode, odnosno poruke :).

Kao što se vidi na primeru iznad, metod se sastoji iz više delova, ali je to i dalje jedan metod koji se zove uploadVideo:toFacebok:andYoutube. Ovo je odlično pošto tera programera da metode imenuje što deskriptivnije, a time je i svaki argument objašnjen imenom.

Još jedna zbunjujuća stvar u nizu je poziv metode sa [objekat imeMetode:arugment1 izViseDelova:argument2]. Objective C ima tu još dosta interesantnih stvari kao što su kategorije i selektori. Ali ako nastavim da pišem neću se zaustaviti.

Java

Na drugoj strani imamo Javu, do nedavno drugi najpopularniji jezik (uvek se kolje sa C-om za prvo mesto).

Velika razlika između ova dva jezika je u tome što Java ima virtuelnu mašinu, pa se kod kompajlira u byte code, koji se izvršava na svakom sistemu koji ima virtuelnu mašinu (Windows, Linux, Solaris, OS X).

Takođe, Java ima garbage collector, koji se brine o memoriji, tako da u samom jeziku postoji ključna reč new, i to je to. :) Nema delete, release ili bilo šta slično.

Kao (trenutno) drugi najpopularniji jezik java ima i ogromnu zajednicu iza sebe. Toliko veliku da postoji čak i lokalni java user group pod imenom JavaSvet. Velika zajednica znači da možete naći odgovore na skoro sve vaše probleme, ali i da postoji poveći broj raznih biblioteka koje vam pomažu u radu (poput fenomenalnog Spring frejmvorka, Apache Commons, log4j, JUnita i još mnogo drugih).

Međutim, mora se naglasiti, da se za Android ne radi na java virtuelnoj mašini, već Dalvik virtuelnoj mašini. Razlikuje se po tome što je optimizovana za mobilne uređaje. Android Java ima sintaksu Java programskog jezika, ali ne uključuje sve delove Jave. Na primer Swing i AWT koji su delovi Jave SE su isključeni (pošto android ima svoje API-je za GUI), dok nema API-ja iz Java ME.

Za uzvrat Android nudi dodatne API-je (rad sa GPSom, bazom i raznim senzorima), ali i neke bibiloteke su odmah uključene, poput Apache HttpClient-a. Dobra stvar je to što je integracija sa Google-ovim servisima odlična.

UI Dizajn

Developerima je dizajn često manje bitan, ali korisnici ipak imaju dodir (u slučaju mobilnih aplikacija bukvalno dodir) sa interfejsom, tako da je on bitan, a u nekim slučajevima presudan.

Poznato je da Apple generalno ima lepe uređaje i našminkane aplikacije, što većini korisnika i odgovara. Zato sam Apple polaže dosta i na UI kao i UX. Nisu džaba smislili da postoji jedna rezolucija za razvoj.

Takav pristup olakšava rad developeru, ali i dizajnerima, iz prostor razloga što se radi jedan dizajn, i nema dodatnih izmena, pošto drugih uređaja i nema.

Apple je developerima ponudio Interface Builder koji je od verzije 4 Xcode-a integrisan. Dosta je sličan GUI alatima kao što je deo Visual Studija ili NetBeans-ovog Matissea. Dakle sistem je dosta jednostavan – prevucite komponente koje su vam potrebne na ekran, i to je to, biće tu gde ste ih stavili. Naravno, te komponente se vezuju sa kodom, pa ih je moguće animirati ili šta je već potrebno.

Takođe, Apple je dao i Human Interface Guidelines sa preporukama kako šta treba da izgleda u aplikaciji.

Sa druge strane Android je poznat po svojoj fragmentaciji – veliki broj uređaja, sa različitim hardverom, što uključuje i različite ekrane. To podrazumeva više vremena za razvoj, ali i više posla za test tim (ako postoji naravno), koji bi trebalo da isproba aplikaciju na svim značajnim uređajima.

Razvoj GUI-ja za Android se radi preko XML-a što možda na prvu loptu deluje arhaično, ali zapravo i nije toliko loše. Lepo su i osmislili kako da se prilagodimo za sve tipove ekrana, tako da se može dosta lakše raditi. Google je u međuvremenu izbacio i svoj Design guideline.

Eclipse ima plagin za rad sa GUI-jem koji je od verzije do verzije sve bolji, tako da za neke osnovne stvari ne morate kucati XML. Idea intellij je dodala preview opciju, tako da pri pisanju XMLa možete videti kako će taj ekran izgledati.

Iskreno nisam još radio za Android tablet uređaje, ali su od Ice Cream Sandwicha uveli jedinstven GUI i za tablet i mobilne uređaje, što je za svaku pohvalu.

Distribucija aplikacija

Aplikacija može da bude najbolja na svetu, ali ako ne dođe do svojih korisnika ona ne postoji. Zato su i Apple i Google napravili sa jedne strane App Store, a sa druge Play.

Ono što je zajedničko je to da je iza obe prodavnice ogromna infrastruktura, kao i veliki broj korisnika. Što se tiče zarade i tu je ista stvar, developer dobija 70%, u prodavnici ostaje 30%.

Međutim, kod Apple Storea postoji proces odobrenja aplikacije. Svaka aplikacija se na određeni način testira i može biti odbijena. Jedan od novijih slučajeva je sa mail aplikacijom Sparrow, kojoj nije dozvoljeno da koristi push notifikacije. Licenca za developera je 99$ godišnje, postoji i varijanta za veće firme, ali za startap to nije od koristi.

Kod Google Playa je (skoro) potpuno druga priča. Možete kačiti razne aplikacije i one neće biti odbijene. Time je i jasno zašto Play ima više aplikacija lošijeg kvaliteta u odnosu na App Store. Developerska licenca je 25$, ali se plaća samo jednom.

Prednost kod Androida je što ne postoji provisioning profile-a, sertifikata, dodavanje uređaja za development, već se aplikacija može pokrenuti na bilo kom uređaju. Samo pošaljete .apk fajl (kod iOS je .ipa) i korisnik može da pokrene aplikaciju.

Velika pogodnost Androida je što Google Play nije jedini market, ima ih puno. Amazon je napravio svoj Appstore (zanimljiv odabir imena morate priznati), postoji AppBrain, kao i dobri stari GetJar (koji je bio za stare Java ME aplikacije) i još mnogo drugih.

Zarada

Na kraju se priča dobrim delom svodi na mogućnosti zarade. Ovde moram opet da se ogradim, govoriću samo o situaciji na globalnom nivou.

Donekle je očekivano, po prirodi korisnika, da iOS ima veću prodaju aplikacija. Što je i normalno pošto App Store ima više od 725k aplikacija, a Google Play više od 450k. Broj preuzetih aplikacija i sa jednog i sa drugog marketa je ogroman (25 milijardi naspram 10 milijardi) iz čega sledi da je tržište ogromno.

U App Store-u je veći udeo plaćenih aplikacija, dok je na Play-u veći broj besplatnih. Zarada od iPhone i iPad aplikacija je drastično veća (grafik ispod je od Novembra prošle godine, ali samo za SAD). U tom trenutku su iAplikacije donosile čak 6 puta više novca, što je broj za svako poštovanje.

Android je u prednosti kad je reč o freemium aplikacijama, gde je procenat od zarade takvih aplikacija veći nego kod iOS uređaja. To naravno ne znači da je to dobitni model, ili da je preporuka da se tako radi, već trenutno stanje.

Svakako pri pokretanju startapa je potrebno osmisliti i poslovni model aplikacije. Da li da bude besplatna, da li da bude freemium varijanta, ili da se naplaćuje.

Najmanje popularna varijanta je postavljanje reklama unutar aplikacije, koje su po nepisanom pravilu u besplatnim verzijama aplikacije. Kakvo je stanje sa reklamama na ove dve platforme možete videti na vrlo simpatičnom infografiku.

Umesto zaključka

Često me ljudi pitaju da uporedim ove dve platforme, kao i sa kojom da se krene neki projekat. Dosta zavisi od sitacije u kojoj se development tim nalazi.

Dosta faktora je u igri, od opreme sa kojom se raspolaže (računari, telefoni), poznavanja jezika pa i do sklonosti developera. Poznajem veliki broj die hard Linuxaša koji ne bi prišli Apple-u, ali i dosta iDevelopera kojima Java deluje preglomazno i sporo. Naprosto, tačnog odgovora nema.

Mislim da je odlično što postoje dve zrele platforme koje se šire velikom brzinom. Uspeh iPhone-a i iPada je neverovatan – od uređaja koji je veliki broj ljudi smatrao preglomaznim telefonom nastao je hit koji donosi i Appleu i developerima ogromne zarade.

Razni Android modeli su se i kod nas raširili neverovatnom brzinom. Sećam se trenutka kada se pojavio Android G1, mislio sam da će godine proći dok se ne pojavi neki Android uređaj kod nas. Sada su već svi operateri najavili prodaju Galaxy S3 manje-više kad i svuda po svetu. Ima tu još kandidata kao što je Microsoftov Windows Phone, koji stvarno dobro izgleda.

Sve skupa, deluje da nema boljeg trenutka da se postane mobile developer. Izbor je sve veći, platforme su sve bolje, a korisnika ima sve više i više. Možete krenuti već danas.

Vuk Nikolić

Objavio/la članak.

ponedeljak, 28. Maj, 2012.

IT Industrija

🔥 Najčitanije

Milan Petrovic

subota, 11. Jul, 2015.

Hvala na motivacionom tekstu koji ce pokrenuti svakog iole ambicioznu, radoznalu osobu. Sjajan tekst zaista. Sve najbolje autoru.

Aleksandar Glisovic

sreda, 19. Septembar, 2012.

Vredi pogledati i http://www.appcelerator.com/

Бојин

utorak, 12. Jun, 2012.

Одличан текст, свака част Вуче! Посебно је добар UML дијаграм. ;-)

Nikola

utorak, 29. Maj, 2012.

Desetka! ;) Zaboravio si jedno bitno razvojno okruženje, koje sigurno neće da crashuje, radi ultra brzo, šljaka i na mac-u i PC-u i ima gomilu pluginova - Vim :)

srdjan

utorak, 29. Maj, 2012.

BTW, autor gornjeg tvita je founder www.xamarin.com (ranije MonoTouch) , kao i Mono projekta. Ko dolazi iz .NET/C# sveta (ili poznaje Javu koja je slična) može da ide i tim smerom.

srdjan

utorak, 29. Maj, 2012.

http://twitter.com/migueldeicaza/status/203642816008695808 :)

Vuk Nikolić

utorak, 29. Maj, 2012.

PhoneGap, Titanium, Sencha i ostali su stvarno super tehnologije, i definitivno je nešto na šta treba obraiti pažnju. Čak je bila i radionica na tu temu http://startit.rs/startap-radionica-html5-mobilne-aplikacije/. Kada zaživi mislim da će svima biti lakše :) Ovde je više bilo reči o native pristupu. Bilo bi interesantno videti poređenje native vs html5, šta je brže, lakše, gde su problemi. Pogotovu ako se razvija za obe platforme u paraleli (ili čak i više platformi)

Miloš

utorak, 29. Maj, 2012.

Super tekst, ali mislim da ste propustili jednu jako bitnu stvar koja se polako približava, a to je razvoj mobilnih aplikacija u HTML5, kao i platforme koje to omogućavaju (recimo PhoneGap).