Titanium SDK tapasztalatok

A Titanium SDK egy ingyenesen letölthető és használható programcsomag azok számára, akik iPhone-ra vagy Androidra, esetleg egyszerre a kettőre szeretnének fejleszteni és túl hosszadalmasnak vagy bonyolultnak találták ezek eszközök sajátságainak megtanulását (ObjectiveC, Android Java). Programunkat egyszerűen JavaScript nyelven készíthetjük el, azonban a kész program jóformán natív alkalmazás lesz. Nyár közepe óta Titaniummal fejlesztek, most leírom a tapasztalataimat.

Az SDK

A Titanium SDK-t az Appcelerator fejleszti. Jelenleg 1.7.2-es verziónál tart, ami már viszonylag kiforrottnak tekinthető. Nem sokkal ezelőtt úgy nézett ki a dolog, hogy csak egy programot adtak, amit OS X-re, Linuxra vagy windowsra letöltve a programunkat le tudtuk fordítani a mobilokra, azonban az 1.7-es SDK-t átgyúrták egy Eclipse pluginné. Így már mondhatjuk, hogy az Eclipse-t, project manage-elő és szövegeditorként használva egy teljes értékű fejlesztő környezetet kapunk a csomagban.

Az ingyenes SDK az alapvető igényeket kielégíti, azonban ha programunkban komolyabb rendszerfunkciókat (pl. In-App purchase, Push notification, webes statisztikák készítése) is ki akarunk használni, akkor egy havi díjas fejlesztői hozzáférést is kénytelenek leszünk vásárolni.

Natív programok JavaScriptben

Ellentmondásosnak tűnik? Pedig egyszerű! A Titanium tartalmaz iPhone-ra és Androidra is egy szoftver réteget, aminek célja, hogy az alatta lévő OS sajátságait a programunk elől elfedje és egy közös, JavaScript-ből hívható felületen keresztül hívhatóvá tegye. Ha tehát például egy leokézható információs ablakot akarunk készíteni, akkor elég az alert("Hello world"); utasítást kiadnunk, az Androidon és iPhone-on is az operációs rendszer saját ablak rajzoló függvényeit fogja meghívni. Az eredmény nem úgy néz ki, mint egy natív alkalmazás, hanem konkrétan az. A JavaScript kódunk egy előre fordított formában a platform JavaScript értelmezőjével kerül végrehajtásra, ami iOS-en ugyebár a WebKit JavaScript motorja, Androidon pedig a Rhino. Természetesen egy JavaScript kód futtatása lassabb egy natív ObjectiveC hívásnál, azonban ez a nem túl számításigényes feladatokban (azaz az átlag programozás 90%-ában) nem hátráltató tényező. A GUI elemek, animációk, szóval a felhasználó sebességérzetét adó dolgok nagy része az OS által nyújtott rétegekből jön, így azok sebessége szinkronban van a natív programok sebességével.

A Titanium API hívások elég sokrétűek, a két platform saját API készleteinek metszetén kívül természetesen elérhetjük a másikon nem létező funkciókat is (pl. Androidon a modális Progress bar ablakot, vagy iPhone-on a navigációs toolbar-t az ablakok tetején). A programozónak magának kell eldöntenie, hogy egy univerzálisan hordozható forráskódot akar készíteni, vagy egy kis plusz energia befektetésével a két platformon azok sajátságait jobban figyelembe veszi és inkább ahhoz alakítja a programot.

Kinek ajánlott?

Szerintem elsősorban azoknak ajánlható, akiknek nincs idejük mindkét rendszer sajátságainak elsajátítására, és gyorsan nagy eredményeket akarnak elérni. Gyakorlatilag 1-2 nap alatt egy használható prototípus alkalmazást lehet összerakni Titaniummal mindenféle előzetes mobil tudás nélkül is.

A másik előnye, hogy alapvetően arra építenek, hogy a célközönség nagy része a webes szakmából érkezik, ezért nekik a legkönnyebb az átállás. A CSS-hez és JavaScripthez pedig ki ne értene legalább egy kicsit? :)

Érdemes még megemlíteni, hogy a két legelterjedtebb okostelefon platform mellett a Titanium támogat desktopra fejlesztést is, ami végeredményben HTML GUI-val rendelkező alkalmazásokat szül. Én ezt nem nagyon támogatom, úgyhogy nem is mondanék róla többet, akit érdekel, járjon maga utána. (Így készült pl. a Wunderlist.)

Tapasztalatok

Én jelenleg 4 programot fejlesztettem eddig a nyár közepe óta Titaniummal, ezek:

  • Egy hely alapú közösségi szolgáltatás mobil appját (khm)
  • TraffipaxInfo
  • BeerTimer (egyelőre nem letölthető)
  • Horoszkóp

Az első dolog, ami nagyon megerőltető tud lenni, hogy odaadják a kezedbe az eszközöket, de nem adnak egy sablont, ami alapján dolgozhatnál. Úgy írod meg a programot, ahogy neked tetszik. Nincs semmi iránymutatás, hogy hogy érdemes szeparálni a dolgokat, vagy például hogy hogy válaszd szét a modellt a view rétegtől. Nincsenek elnevezési konvenciók, vagy bármi hasonló. Mivel ezek nélkül viszonylag nehezen tudok programozni :), így számomra az volt az első, hogy egy átlalános keretrendszert kialakítottam az első programnak, ami annyira bevált, hogy azóta a másik három is abban készült el.

A második felismerés, hogy roppant könnyen látványos eredményeket lehetett elérni, azaz egy nap alatt a programok fő funkcióit adó dolgokat – mint pl. a GPS pozíció, adatok letöltése egy szerverről, vibra motor használata, képmegjelenítés – működésre tudtam bírni. Ebben nagy segítséget nyújt a KitchenSink nevű demo program, ami bemutatja a Titanium által nyújtott API-k nagy részének használatát.

A programfejlesztésre fordított idő legkisebb része volt azonban a program vázának elkészítése, ennél lényegesen nagyobb feladat volt, hogy minden funkció úgy működjön, ahogy azt elvártuk. Mondok egy példát: GPS koordinátát kiírni pofon egyszerű (negyed óra), azonban úgy megírni a programot, hogy Androidon és iOS-en is folyamatosan aktuális koordinátákat jelenítsen meg, és minden készüléken jól működjön, sokkal nehezebb (4-5 napom elment vele). A probléma nem csak ott van, hogy a triviális hívásokon kívül ilyenkor az extrém eseteket is kezelni kell (a példánál maradva mondjuk azt, hogy nincs GPS a készülékben), hanem itt már előjöttek a Titanium hibái is. Mert abból bizony akad nem is kevés. (Pl. a GPS pozícióváltás eseményre fel tudsz írni egy függvényt, és megadhatod, hogy hány méter változás esetén hívódjon meg az. Ez 1.7.2-es SDK-val iOS alatt egyáltalán nem működik, minden centi változásra meghívódik a függvény.)

Szerencsére elmondható, hogy elég korrekt az API dokumentáció, valamint van egy aktív és segítőkész közösség is, akik általában elég gyorsan reagálnak a felmerülő problémákra a fórumban. Átalában ha ott nincs valamire megoldás, akkor az bizony csak nálad szar, és te rontottál el valamit.

A legtöbb problémám amúgy Androdidal volt, mert az iPhone mindig működött mint a kisangyal. Az Android emulátor egy rendkívül lassú, nehézkes dolog, szenvedés vele fejleszteni. 10-ből 4-szer nem is hajlandó elindulni, vagy valami probléma okán nem sikerül a fordítás. Erre már megvannak a saját rituáléim, mikor mit kell tenni, ha valaki elakadna, szóljon :) Összességében nekem kétszer annyi idő volt az Androdion is jól működő verzió kifejlesztése, mint az iPhone-os.

Publikálás

Kicsit féltünk tőle, hogy az Apple mit fog szólni a Titaniummal készített programunkhoz, de semmi gond nem volt vele, simán beengedték az App Store-ba. Természetesen szükséges ehhez a szokásos iPhone Developer account (pénzes) regisztráció. Hasonló a helyzet Androidon is, ott is ki kell pengetni az éves díjat. A megfelelő provisioning profile-okat be kell adagolni a Titaniumnak, és onnantól az Xcode-ot nem is látva tudunk telefonon tesztelni, illetve a Store-ba feltölthető verziót fordítani.

Tippek

Csokorban szeretnék pár tippet összeszedni, amik talán a kezdőket segítik, mert én is beléjük futottam. Nem kell semmitől megijedni, vannak bugos dolgok, de mindent meg lehet oldani.

  • iPhone-on bizonyos SDK verziókkal csak a Resources könyvtárban lévő képeket tudta megnyitni valamiért. Az 1.7.2-nél már mennek az alkönyvtárak is
  • az SVN rejtett fájljait nem szereti, fordításkor hibákat dob, ha vannak
  • valamiért nálam az iPhone-on futtatás csak úgy működik, hogy fordításkor az iTunes-ba betölti az új verziót, amire jobb gombot kell nyomni, és Reveal-lel a Finderben kitallózni. Ezt a fájlt rá kell húzni az Xcode Organizer-jében az eszközre kézzel
  • amikor Androidon váltunk emulátor és eszköz között, akkor a build/android könyvtár letörlése javasolt, mert néha belezakkan
  • amikor új API funkciókat kezdünk el használni, akkor gyakran jelez futási hibát, ami simán azért van, mert nem vette észre, hogy azt is be kéne linkelni a buildbe. Szintén a build könyvtár megfelelő alkönyvtárának (iphone/android) letörlése meggyógyítja
  • a TableView appendRow() függvénye nálam hibás volt, helyette a setData javasolt
  • iPhone Simulatorban nem lehet felbontást váltani vagy más programot elindítani, mert belefagy. Ilyenkor kézzel el kell indítani a Simulatort, elvégezni a módosításokat, kilépni, majd utána már azt fogja használni a Titanium is
  • Debuggolni csak 1.7.1 óta lehet
  • Előfordult, hogy Androidon debug módban nem ment az ablak nyitás. Nem debuggerrel működik.
  • 9-patch fájlokat a Resources/android könyvtárba kell rakni, nem lehet a Resources könyvtárban másik fájl azonos néven, mert különben az lesz aktív
  • ZTE Blade USB csatlakoztatása esetén OS X-en Eject-et kell nyomni
  • Néha elhal a buildelés a leghülyébb hibákkal. A build könyvtár letörlése ÉS a Titanium SDK újraindítása mindig segít.
  • Androidon nem mindig hívódik meg a GPS location event callback-je, csak az első alkalommal. Lehet úgy workaround-olni, hogy mindnen híváskor újra beállítod az accuracy-t
  • A build tartalmának letöltése után első buildeléskor általában tiapp.xml-es hibát jelez. Ezzel nem kell foglalkozni, a második build már sikerülni fog.
  • A TiStoreKit (In-App purchase modul) nálam csak 1.6.3-mas SDK-val megy és csak nem jailbreakelt telefonon.

Szóval látható, hogy akadnak még bugok, de ezeket folyamatosan javítják ki, és ezek ellenére elég használható a cucc. Aki instant akar fejleszteni, szerintem adjon neki egy esélyt!

Sok sikert kívánok mindenkinek, aki belevág!

2 hozzászólás

Submit a Comment
  • csibar

    Köszi, hasznos volt (lesz).

  • tata

    hasonló tapasztalataink vannak vele, a Corona SDK-t kevéssé találtuk macerásnak, viszont ott (egyelőre) a klasszikus UI fejlesztés macera, így éppen ugyanolyan lábonlövés tud lenni mint a Titanium, csak a másik lábba.

Submit a CommentPlease be polite. We appreciate that.

Your Comment