mardi 11 mai 2010

Arhitectura iPhone OS

Sistemul de operare al echipamentului iPhone este construit pe o structura UNIX BSD. Nucleul/Kernel sistemului de operare Darwin iPhone este un micro nucleu/kernel bazat pe XNU (X is Not Unix). El este si un hibrid al micro-nucleului MACH cu componente din BSD. XNU este un nucleu/kernel de sistem de operare ce a fost achizitionat de Apple si dezvoltat pentru realizarea sistemului de operare Mac OS X. Astfel Apple se lansea în lumea softului liber, avand un sistem de operare Darwin.
XNU are in componenta cod dezvoltat pe arhitectura legendara MACH. Aceasta a fost creata in cadrul unui proiect de cercetare de la Universitatea Carnegie Mellon la mijlocul anilor 1980. Aceasta arhitectura provine la randul ei de la sistemul de operare Accent, de asemenea, dezvoltat la CMU. Primele versiuni de MACH au avut nuclee/kernel-e monolitice, cu o mare parte din codul nucleului/kernel-ului BSD. MACH 3.0 a fost prima implementare a unui micro-nucleu.
Nucleul/kerne-lul sistemului de operare Mac OS X, numit si XNU, este compus din trei elemente: MACH, BDS si I/O-Kit. Nucleul iPhone pastreaza cele trei componente dar nu este acelasi (ceea ce este si normal) cu un nucleu/kernel Mac OS X 10.x.x.

MACH

MACH numeste spatiul de adresse "tasks", si un task poate contine zero sau mai multe threads. La iPhone exista un singur task, cel principal, al aplicatiei si mai multe threads-uri.

BSD

Partea BSD a nucleului/kerne-lului XNU implementeaza procese UNIX peste task-urile MACH, semnalizari UNIX peste exceptiile MACH si IPC (Inter Process Communication) MACH. Sunt implementate aici si semanticile sistemului de fisiere UNIX cum ar fi cele legate de retea TCP/IP. Componenta VFS (Virtual File System) permite cuplarea sistemului de fisiere BSD. Infrastructura /dev se cupleaza direct in I/O Kit. BSD exporta toate tipurile de semantici prin interfata apelurilor system, "syscall". Spre exemplu acestea pot fi :"open()" si "fork(). Aceste semantici trebuie sa fie compatibile ca la orice sistem de operare UNIX/BSD/POSIX.
Fiind practic doua nuclee/kerne-luli in XNU (MACH cu mesajele sale ce trec prin API si BSD cu POSIX API) exista doua tipuri de apeluri sistem/syscalls. In timp ce ambele utilizeaza singurul punct de intrare int 0x80/sysenter/sc, apelurile sistem cu numere id negative vor fi rutate spre MACH, pe cand cele pozitive spre BSD.

lundi 10 mai 2010

Jailbreak si Unlock

Odata cu iesirea pe piata a iPod touch si apoi a iPhone a inceput sa circule un nou cuvant Jailbreak. Jailbreaking este un proces care permite atat pentru utilizatorii iPod Touch cat si pentru utilizatorii iPhone de a rula coduri neoficiale pe dispozitivele lor ocolind mecanismul oficial de distribuţie Apple, App Store. Odată realizat procesul de jailbroken, utilizatorii iPhone pot descărca mai multe aplicaţii, ce nu erau disponibile anterior prin intermediul App Store, prin intermediul altor aplicatii de instalare neoficiale cum ar fi Cydia, App Rock, Ice şi Installer.
Jailbreaking este diferit de deblocarea cartelei SIM (Unlock), care este procesul prin care un dispozitiv mobil devine compatibil cu reţelele de telefonie pentru care nu avea licenţe speciale pentru a fi utilizat in interiorul lor.
La lansarea iPhone OS 2.0, un grup de hackeri numit iPhone Dev Team (http://blog.iphone-dev.org/) a creat un soft de jailbreaking numit Pwnage Tool, care utilizează o interfaţă grafică.
În ianuarie 2009, iPhone Dev Team a început activitatea lucrand la iPod Touch 2G Jailbreak. “redsn0w lite” a fost numele produsului care permitea operatia de Jailbreak pentru iPod Touch 2G. In aprilie 2009, a fost furnizata o versiune ameliorata redsn0w 0.1.
Dupa trei luni de la lansarea iPhone OS 3.0, Dev Team furnizeaza doua softuri PwnageTool 3.0 si redsn0w 0.7.2, cu care utilizatorii iPhone 3G si iPod Touch pot realiza operatia de Jailbreake utilizand Windows dar si Mac OS X.
La data de 9 septembrie 2009, Apple a lansat iPhone OS 3.1. Noul OS dezactiva capacitatea ca aparatul iPhone sa fie jailbreak. Dev Team a lansat un jailbreak pentru toate dispozitivele (cu excepţia iPod Touch 3-a generaţie), numit Pwnage Tool 3.1-3.
La data de 11-10-2009, George Hotz, cunoscut sub pseudonimul "geohot", a lansat utilitarul "blackra1n", care permite tuturor sa faca procedura de jailbreaking pentru iPhone si iPod touch ce au OS 3.1.2.
La data de 02 noiembrie 2009 Hotz lansat o versiune si mai nouă a utilitarului blackra1n "RC3". Este o actualizare care poate să realizeze procedurade tip jailbreak pentru iPhone 3G şi iPhone 3GS. Aceasta este realizata pentru versiunile dispozitivelor iPhone cel mai recent fabricate. Acestea au ROM-ul de boot actualizat. Apple corectat falia de securitate "24kpwn" exploatata de jailbreaks-urile anterioare. Hotz a lansat, de asemenea, "blacksn0w", un utlitar pentru deblocarea iPhone, (Base Band 5.11.07). Pentru OS 3.1.3 cu Base Band ICE2-05.12.01 nu exista inca utilitar care sa deblocheze iPhone-ul. Exista un utilitar Fuzzyband care reuseste sa retrogradeze versiunile 3.1.3 cu Base Band 05.12.01 dar cu bootloader 05.08.

Utilizarea iPhone ca o cheie USB de memorie

Phone Disk este o aplicatie Mac ce permite utilizarea unui iPhone ca un hdd extern. Aplicatia poate fi gasita la http://www.macroplant.com/phonedisk/ . Din pacate nu este disponibila si pentru Windows.Editorul programului,Macroplant, propune aceasta aplicatie gratuit pana in Septembrie 2010. Se observa mai jos structura de fisiere iPhone. Spre exemplu, daca dorim sa transportam poze, ca sa nu cream un nou director, poutem utiliza cel din /private/var/mobile/Media/ .Pentru fisiere .mp3 putem utilza /private/var/mobile/Media/iTunes_Control/ . In final, pentru alte documente se poate utiliza /private/var/mobile/Media/Downloads. Nu este recomandabil sa creati noi directoare decat in home directory a utilizatorilor "mobile" si "root".

Instalarea aplicatiilor pe iPhone

Exista doua tipuri de moduri de a instala o aplicatie pe telefonul iPhone. Primul mod este cel prin Apple Store. Mai intai cei care dezvolta aplicatii iPhone trebuie sa se inregistreze pe site-ul: http://developer.apple.com Exista mai multe tipuri de conturi pentru dezvoltatorii de aplicatii iPhone.Se plateste o suma de bani pe an in functie de tipul contului. Spre exemplu, pentru un cont personal de dezvoltator de aplicatii se plateste $99 pe an iar pentru un cont de dezvoltator de aplicatii pentru firme $299 pe an. Exista si conturi gratis pentru dezvoltatori/programatori de aplicatii si pentru studenti. Apple propune mai multe "iPhone Developer Program" programe ce pot fi accesate din diferitele tipuri de conturi mentionate mai sus. In figura de mai jos se observa serviciile care sunt furnizate dezvoltatorilor/programatorilor de aplicatii iPhone prin diferitele programe de lucru.Se observa ca pentru contul de $99 exista doua programe "iPhone Developer Program". Chiar si pentru conturile gratis, toata lumea are posibilitatea recuperarii SDK-ului pentru iPhone si Mac. Serviciul Pre-Release Software&Tools creeaza o facilitate de a permite dezvoltatorilor/programatorilor de a include in procesul lor de lucru ultimele tehnologii Apple si de a testa compatibilitatea acestora cu mediul lor de dezvoltare. Cei de la Apple sunt interesati de bug-uri si de rapoartele de functionare.
Exista o optiune de a creea de echipe de dezvoltatori/programatori ce este inclusa numai pentru University, Enterprise si Company iPhone Developer Program. Forumurile pentru programatorii Apple sunt accesibile pentru toate profilurile de conturi, cu o exceptie cel de baza-gratuit, care nu are aceasta optiune. Pentru cei ce dau bani, Apple le ofera cate doua interventii tehnice pe an din partea Apple Support. In rest, se poate face cerere si se factureaza.Aplicatiile pot fi distribuite in trei moduri: Ad Hoc, In-House si App Store. Aplicatiile distribuite de App Store sunt pentru publicul larg si pot fi accesate si instalate cu aplicatia App Store de pe iPhone. Poti fi gratuite, (Shareware/Freeware) sau contra-cost. Toata lumea poate avea acces la distributia lor. Pentru a trimite spre publicare o aplicatie catre App Store, programatorul utilizeaza un web-tool numit iTunes Connect. Dezvoltatorul/programatorul va folosi profilul sau (app Store Distribution Provisioning Profile). Cum arata si figura de mai jos, fiecare propunere de aplicatie are un formular care trebuie completat. Trebuie inscrise, numele companiei persoana ce l-a creat, URL-ul companiei, URL-ul unde poate fi upload-ata aplicatia, tipul de licenta, categoria unde va fi catalogata aplicatia, descierea aplicatiei, un abstract al descrierii aplicatiei. Dupa ce se completeaza toate aceste informatii se apasa pe Submit. Mai nou, programatorul va primi un tichet de confirmare. Dupa o saptamana, cand aplicatia a fost validata de Apple, se va introduce si pretul plus datele comerciale (cont bancar creditor, adresa firma, etc). In figura de mai jos este afisat exemplul unei cereri pentru a deveni membru in cele doua tipuri de conturi.Aplicatiile distribuite Ad Hoc sunt pentru un public restrans, pentru asa numitii beta-testeri selectionati de catre producatorul aplicatiei. Aplicatiile sunt instalate individual pe iPhone, utilizandu-se UDI (Unique Device Identifier) iPhone-ului. Pentru a afla si trimite UID-ul pe email la cel care vrea sa va lase sa testati aplicatia dvs., se poate folosi UDID Ad Hoc Helper a Erica Sadun ce este free si gratis pe App Store. Programatorul navigheaza in sectiunea "Provisioning" din Program Portal de la Apple si selectioneaza butonul radio 'Ad Hoc'. Se introduce numele profilului versiunii de distributie AdHoc (AdHoc Distribution Provisionong Profile). Se confirma creearea unui certificat iPhone de distributie si afisarea lui. Apoi se selectioneaza App ID pentru aplicatie sau o suita de ID-uril pentru a fi distribuite. Se selecteaza pana la 100 de UDID-uri unde aplicatia poate functiona. Si se apasa pe butonul Submit. Se descarca fisierul .mobileprovisioning click-and pe numele profilului versiunii de distributie. Se incarca in Xcode sau iTunes pentru a-l instala.
Aplicatiile distribuite In-House sunt pentru companiile ce vor sa dezvolte aplicatii pentru angajatii lor. Pentru a beneficia un astfel de program de distributie a aplicatiilor iPhone sunt necesare multe date despre firma. Aplicatiile nu mai trebuie sa fie validate de Apple Store. Ca si la AdHoc Distribution procesul este de a obtine certificatele de dezvoltare/programare si de a atribui echipamentele la o echipa de dezvoltare/programare (development team). Apoi, crearea profilurilor de distributie a versiunii dezvoltate si instalarea lor in Xcode sau iTunes. Aceste 'Enterprise Distribution Provisioning Profile' sunt create via Developer Program portal (sunt fisiere .mobileprovision).In concluzie, respectand modelul de instalare Apple al aplicatiilor, exista doua moduri de a instala in iPhone acestea : utilizand App Store din iPhone (cumparand sau incercand aplicatiile) si utilizand iTunes cu Xcode (aplicatii legate de firme).Al doilea tip de mod de a instala o aplicatie in iPhone este legat de necesitatea de a "introduce" si alte modele de a "procura" aplicatii. Acest lucru poarta numele de Jailbreake. Deci, pentru discutia urmatoare consideram ca echipamentul iPhone este jailbreake-at. In acest caz folosim Cydia, instalam openSSH si Installous. Aplicatiile sunt fisiere cu extensia .ipa. Installous il gasim la adresa http://cydia.hackulo.us Aceasta adresa poate fi introdusa din meniul Manage->Edit->Add. A se vedea figura urmatoare.In meniul Search se cauta aplicatia Installuos si se instaleaza. Sa presupunem ca avem pe PC sau Mac un fisier aplicatie xyz.ipa. Acesta va putea fi transferat prin SFTP, gratie openSSH care l-am instalat cu ajutorul Cydia.Fisierele cu extensia .ipa se vor instala in directorul /private/var/mobile/Documents/Installous/Downloads . Se va executa de pe iPhone Installous si se va apasa pe meniul Downloads.Dupa cum se vede in figura de mai sus aplicatiile ce au fost transferate ai aparut pe ecran. Se va apasa pe aplicatia dorita si Installous va face instalarea aplicatiei dorite.
In concluzie, exista si alte modalitati de a instala aplicatiile .ipa, dar aceasta este foarte simpla. Pentru cei ce sunt Unix, pot observa ca iPhone este o masina Linux FreeBSD modificata. In acest caz sa se controleze drepturile de acces ale aplicatiei. In general un chmod -775 este necesar.
In acest articol am prezentat doua tipuri de instalare a aplicatiilor pe iPhone. Cele doua instalari provin din cele doua lumi ale iPhone: lumea iTunes si lumea Cydia.

lundi 3 mai 2010

Butoane de alunecare, campuri de texte si buton simplu

In acest exercitiu se va arata cum se poate folosi clasa UISlider. Scopul lui este de a intelege cum se citeste o valoare ce variaza in functie de un buton de alunecare si de a introduce o noua valoare dintr-un camp de text(UITextField) apasand un buton (UIButton).
Mai intai se va crea un nou proiect in XCode cu numele butonalun si va vi de tipul View-Based Application.

dimanche 2 mai 2010

Prima aplicatie iPhone (de incalzire)

Desigur, pentru cei ce vor sa invete pentru prima oara sa programeze pentru iPhone,se recomanda traditionala aplicatie "Hello World!". Acest exercitiu are ca obiectiv familiarizarea cu cateva instructiuni din libmajul C-Object. Se presupune ca mediul de dezvoltare XCode cu SDK este deja instalat pe Mac.
Mai intai si intai, trebuie creat un proiect nou. Pentru aceasta, lansam XCode. Apoi, Select File > New Project sau Apple Key + Shift + N pentru a lansa fereastra NewProject. Aceasta fereastra, cum apare in figura de mai jos, are doua zone.In partea stanga se selecteaza zona de Applications pentru iPhone OS. Se observa ca in partea dreapta vor aparea o serie de iconite. Se va selecta cea cu View-based Application (Aplicatie cu afisaj de baza). Apoi se va introduce numele proiectului si zona unde va fi inregistrat pe harddisk.Numele proiectului va fi helloworld. Dupa crearea lui, o fereastra se va afisa ca cea de mai jos.
Se observa ca au aparut patru fisiere in pachetul Classes. Este tipic C-Oject care imbina limbajul C cu notiunile de POO.

helloworldAppDelegate.h
helloworldAppDelegate.m
helloworldViewController.h
helloworldViewController.m

Fisierul antetului delegat contine o referinta la obiectul UIWindow (linia 14) ce controleaza toate interactiunile utilizatorului cu aceasta aplicatie si gestioneaza toate componentele unei interfete. Deasemenea contine o referinta la helloworldViewController (lina 15) care gestioneaza afisarea programului nostru.
In fisierul sursa aplicatiei delegate (helloworldAppDelegate.m) se afla o metoda auto-generata: applicationDidFinishLaunching. Aceasta este invocata cand aplicatia este incarcata/lansata. In aceasta metoda se adauga obiectele helloworldViewController la UIWindows si se vor face vizibile;

linia 22 [window addSubview:viewController.view];
linia 23 [window makeKeyAndVisible];

Interfata utilizatorului iPhone SDK respecta arhitectura modelului de proiectare MVC (Model View Controller). Astfel fiecarui afisaj (view) ii corespunde un obiect View Controller Object. XCode a creat un afisaj (view) automat legat la helloworldViewController. Este definit in fisierul helloworldViewCotroller.xib.Pentru a utiliza evenimentele generate de afisaj trebuie sa se creeze as numitele controloare (controls)/interpretoare. De notat ca aceste controloare se pot realiza utilizand aplicatia Interface Bulider.
Ca sa adaugam controloarele si interpretoarele de evenimente deschidem fisierul helloworldViewController.h si intre acoladele definitiei iterfetei helloworldViewController se vor adauga urmatoarele linii:

IBOutlet UIButton *button;
IBOutlet UILabel *label;
IBOutlet UIView *myView;
In acest fel s-a definit un afisaj, un buton si o eticheta-text pentru a fi vizualizate pe ecranul iPhone-ului. Dupa ce s-au definit aceste variabile, trebuie adaugat cum se vor interpreta actiunile diferitelor evenimente pentru buton, afisaj sau eticheta-text. Deci, dupa acolade se vor adauga urmatoarele linii:

linia 11 -(IBAction)handleEvent:(id)sender;
linia 12 @property (nonatomic,retain) UIButton *button;
linia 13 @property (nonatomic,retain) UILabel *label;
linia 14 @property (nonatomic,retain) UIView *myView;

Mai intai se adauga o sinteza a celor trei elemente UI pentru a crea metode de tip getter si setter (a se vedea programarea orientata pe obiecte). Urmatoarele linii vor fi introduse dupa linia 11 @implementation helloworldViewController in fisierul helloworldViewController.m .

@synthesize button;
@synthesize label;
@synthesize myView;

In acest moment se va cauta in fisier "Implement loadView if you want to create a view hierarchy programmatically." si se va de-comenta metoda loadView ce urmeaza acestei linii. Se va adauga urmatoarele linii ale metodei pentru a crea butonul si eticheta-text.
linia 1 - (void)loadViewlinia 2 {
linia 3 // creaza si configureaza afisajul
linia 4 CGRect cgRct = CGRectMake(0.0, 0.0, 480, 320); //defineste marimea si pozitia afisajului
linia 5 myView = [[UIView alloc] initWithFrame:cgRct]; //initializeaza afisajul
linia 6 myView.autoresizesSubviews = YES; //permite sa adapteze marimea elementelor in afisaj
linia 7 self.view = myView;

linia 8 // creaza un UIButton (UIButtonTypeRoundedRect) si setarile de rigoare
linia 9 button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
linia 10 button.frame = CGRectMake(100, 100, 100, 50); // marimea si pozitia butonului
linia 11 [button setTitle:@"Add" forState:UIControlStateNormal];
linia 12 button.backgroundColor = [UIColor clearColor];
linia 13 button.adjustsImageWhenHighlighted = YES;

linia 14 //adauga descriptorul actiunii si seteaza clasa curenta - tinta
linia 15 [button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];

linia 16 //Afisare buton
linia 17 [self.view addSubview:button];

linia 18 //crearea etichetei
linia 19 cgRct = CGRectMake(100, 170, 100, 50); //define size and position of label
linia 20 label = [[UILabel alloc] initWithFrame:cgRct];linia 21 label.text = @"Hello World";

linia 22 //afisarea etichetei
linia 23 [self.view addSubview:label];
linia 24 }

Se compileaza si se ruleaza click-and pe Build and Go.