Lucrare de Licent ,a [630822]
Universitatea Transilvania din Bras ,ov
Facultatea de Matematic ˘a s,i Informatic ˘a
Programul de studiu: Informatic ˘a aplicat ˘a
Lucrare de Licent ,˘a
Joc 2D pentru iOS Multiplayer
Autor: VEGHIU Sorin-Andrei
Coordonator: Conf. univ. dr. DEACONU Adrian
Bras ,ov, 2017
Cuprins
1 Sistemul de operare iOS 1
1.1 Descriere general ˘a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Istorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Securitatea iOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4 Arhitectura iOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.1 Stratul Cocoa Touch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.1.1 Caracteristici de nivel înalt . . . . . . . . . . . . . . . . . . . . 5
1.4.1.2 Framework-urile Cocoa Touch . . . . . . . . . . . . . . . . . . 12
1.4.2 Stratul Media . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.2.1 Tehnologii grafice . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.2.2 Tehnologii audio . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4.2.3 Tehnologii video . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4.2.4 Framework-urile Media . . . . . . . . . . . . . . . . . . . . . . 17
1.4.3 Stratul Core Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.4.3.1 Caracteristici de nivel înalt . . . . . . . . . . . . . . . . . . . . 18
1.4.3.2 Framework-urile Core Services . . . . . . . . . . . . . . . . . . 20
1.4.4 Stratul Core OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2 Limbajul de programare Swift 23
2.1 Descriere general ˘a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.1 Caracteristici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.2 Syntactic sugar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.3 Nivele de acces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.4 Tipul Optional, înl ˘ant,uiri s ,i structurile "if let" s ,i "guard" . . . . . . . . . . 24
2.1.5 Tipul valoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.1.6 Programare orientat ˘a pe protocol . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.7 Biblioteci, runetime s ,i dezvoltare . . . . . . . . . . . . . . . . . . . . . . 29
2.1.8 Gestionarea memoriei prin ARC . . . . . . . . . . . . . . . . . . . . . . . 30
2.2 Framework-ul SpriteKit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.2.1 Scene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2.2 Texturi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.2.3 Act ,iuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.2.4 SKPhysics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.4.1 Coliziuni s ,i contacte . . . . . . . . . . . . . . . . . . . . . . . . 43
3 Limbajul Java s ,i arhitectura serverului 45
3.1 Framework-ul Grizzly pentru serverul HTTP . . . . . . . . . . . . . . . . . . . . . 45
3.2 Serviciile web RESTful (Representational State Transfer) . . . . . . . . . . . . . . 47
VEGHIU Sorin-Andrei
1 Sistemul de operare iOS
1.1 Descriere general ˘a
iOS (cunoscut s ,i sub numele de iPhone OS) este un sistem de operare mobil creat s ,i dezvoltat de
Apple Inc. exclusiv pentru hardware-ul s ˘au, printre care se num ˘ar˘a s,i dispozitivele mobile iPhone,
iPad s ,i iPod Touch. În prezent, este al doilea cel mai popular sistem de operare la nivel global dup ˘a
Android. Sistemul de operare gestioneaz ˘a componentele hardware s ,i ofer ˘a tehnologiile necesare
implement ˘arii aplicat ,iilor native.
Kernelul iOS este nucleul XNU al sistemului de operare Darwin. Începând de la iPhone OS
(versiunea 1.0) pân ˘a la iPhone OS 3.1.3 a fost folosit Darwin 9.0.0d1. În prezent, iOS 10 se
bazeaz ˘a pe versiunea 16 a sistemului de operare Darwin.
Init ,ial lansat în 2007 pentru iPhone, iOS a fost extins pentru a fi folosit în cadrul altor dis-
pozitive mobile Apple, cum ar fi iPod Touch (septembrie 2007) s ,i iPad (ianuarie 2010).
Începând din ianuarie 2017, aplicat ,ia nativ ˘a App Store de la Apple cont ,ine peste 2,2 milioane
de aplicat ,ii iOS, dintre care 1 milion sunt originale pentru iPad-uri. Aceste aplicat ,ii mobile au fost
desc˘arcate colectiv de peste 130 de miliarde de ori.
Interfat ,a utilizatorului iOS se bazeaz ˘a pe manipularea direct ˘a, folosind gesturi multi-touch. El-
ementele de control ale interfet ,ei constau în derulatoare, comutatoare s ,i butoane. Interact ,iunea cu
sistemul de operare include gesturi cum ar fi glisarea, atingerea, împingerea s ,i r˘asturnarea, toate
având definit ,ii specifice în contextul sistemului de operare iOS s ,i a interfet ,ei sale multi-touch. Ac-
celerometrele interne sunt folosite de anumite aplicat ,ii pentru a r ˘aspunde la agitarea dispozitivului
(un rezultat comun este comanda undo pentru mesaje) sau la rotirea în trei dimensiuni (un rezultat
comun este comutarea intre modul portret s ,i modul peisaj). Apple a fost apreciat în mode semni-
ficativ pentru includerea funct ,iilor aprofundate de accesibilitate în iOS, permit ,ând utilizatorilor cu
dizabilitat ,i vizuale s ,i/sau auditive s ˘a utilizeze în mod corespunz ˘ator produsele sale.
Versiunile majore ale iOS sunt lansate anual. Versiunea actual ˘a iOS 10, a fost lansat ˘a pe
13 septembrie 2016. Este disponibil ˘a pentru modelele iPhone 5 s ,i modelele ulterioare, a patra
generat ,ie de iPad, iPad Air s ,i iPad Air 2, iPad Pro, iPad Mini 2 s ,i a s ,asea generat ,ie de iPod Touch.
Aplicat ,iile native autorizate sunt disponibile pe App Store-ul Apple pentru dispozitive care
ruleaz ˘a iPhone OS 2.0 s ,i versiunile ulterioare. Aplicat ,iile native trebuie s ˘a fie scrise în limba-
jele de programare Swift sau Objective-C (opt ,ional pot exista anumite elemente scrise în C sau
C++) s ,i compilate special pentru iOS s ,i arhitectura ARM pe 64 sau 32 de bit ,i, folosind IDE-ul
Xcode. Începând cu lansarea versiunii Xcode 3.1, acesta a devenit mediul de dezvoltare pentru
SDK-ul sistemului de operare iOS.
1
VEGHIU Sorin-Andrei
1.2 Istorie
În 2005, când Steve Jobs a început s ˘a planifice iPhone-ul, a avut posibilitatea de a alege fie
s˘a "mics ,oreze Mac-ul, ceea ce ar fi fost o oper ˘a a ingineriei sau s ˘a m˘areasc ˘a iPod-ul". Locurile
de munc ˘a au favorizat abordarea anterioar ˘a, dar au pus cap ˘at echipelor Macintosh s ,i iPod, con-
duse de Scot Forstall s ,i Tony Fadell, respectiv într-o competit ,ie intern ˘a, câs ,tigând Forstall prin
crearea sistemului de operare iPhone OS. Decizia a permis succesul iPhone-ului ca platform ˘a pen-
tru programatori third-party. Prin utilizarea unui sistem de operare desktop bine cunoscut MacOS,
a permis programatorilor Mac s ˘a scrie software-ul pentru iPhone cu o recalificare minim ˘a. De
asemenea, Forstall a fost responsabil pentru crearea unui kit de dezvoltare software pentru pro-
gramatori pentru a construi aplicat ,ii iPhone, precum s ,i un App Store în cadrul iTunes.
Sistemul de operare a fost prezentat odat ˘a cu iPhone la Macworld Conference & Expo în data
de 9 ianuarie 2007 s ,i a fost lansat în luna iunie a acelui an. În momentul dezv ˘aluirii sale în ian-
uarie, Steve Jobs a sust ,inut c ˘a "iPhone ruleaz ˘a OS X s ,i ruleaz ˘a aplicat ,ii desktop", îns ˘a la momentul
lans˘arii iPhone-ului, denumirea sistemului de operare a fost schimbat ˘a în "iPhone OS". Init ,ial,
aplicat ,iile native third-party nu au funct ,ionat pentru sistemul de operare. Argumentarea lui Steve
Jobs a fost c ˘a programatorii ar putea construi aplicat ,ii web prin browserul web Safari, care "se vor
comporta precum aplicat ,iile native de pe iPhone".
În octombrie 2007, Apple a anunt ,at c˘a pune la cale un kit dezvoltare software (SDK) s ,i au
planificat s ˘a îl dea in folosint ,˘a programatorilor în luna februarie. În data de 6 martie, 2008, Apple
a sust ,inut un eveniment de pres ˘a, anunt ,ând SDK-ul iPhone.
În 2010, Apple a redenumit "iPhone OS" în "iOS". Trademark-ul "iOS" a fost utilizat de c ˘atre
Cisco pentru sistemul de operare, folosit pe routerele sale.
Apple ofer ˘a actualiz ˘ari majore ale sistemului de operare iOS anual prin intermediul iTunes s ,i de
asemenea, începând cu iOS 5 s ,i versiunile ulterioare, prin wireless.
1.3 Securitatea iOS
iOS utlizeaz ˘a numeroase funct ,ii de securitate, atât hardware, cât s ,i software, precum:
Secure Boot
Înainte de pornirea complet ˘a a sistemului de operare, exist ˘a un cod de nivel sc ˘azut ce ruleaz ˘a
din Boot ROM. Sarcina sa este de a verifica dac ˘a bootloader-ul low-level este semnat de cheia
public ˘a Apple CA Root înainte de a o putea executa. Acest proces este de a se asigura c ˘a nici
un software r ˘au intent ,ionat sau software neautorizat nu poate fi rulat pe un dispozitiv iOS. Dup ˘a
ce bootloader-ul low-level îs ,i îndeplines ,te sarcinile, pornes ,te un bootloader high-level, cunoscut s ,i
sub numele de iBoot. Dac ˘a nu se întâmpin ˘a niciun impediment, atunci iBoot va înc ˘arca kernel-ul
iOS-ului precum s ,i restul sistemului de operare.
2
VEGHIU Sorin-Andrei
Secure Enclave
Secure Enclave este un coprocesor g ˘asit în dispozitivele iOS care au în component ,a lor ID Touch
(posibilitatea de recunoas ,tere a amprentelor digitale). Acesta are propriul proces de boot securizat.
O componenta hardware ce genereaz ˘a numere aleatoare este, de asemenea, inclus ˘a ca parte a aces-
tui coprocesor. Secure Enclave-ul fiec ˘arui dispozitiv mobil are un ID unic ce se genereaz ˘a atunci
când este creat s ,i nu poate fi schimbat. Acest indentificator este utilizat pentru a crea o cheie tem-
porar ˘a care cripteaz ˘a memoria în aceast ˘a port ,iune a sistemului. Secure Enclave are, de asemenea,
în component ,a sa un contor anti-repetit ,ie pentru a preveni atacurile de tip brute force.
Codul de acces
Dispozitivele iOS pot avea un cod de acces care este utilizat pentru a debloca dispozitivul, pen-
tru a face modific ˘ari set ˘arilor sistemului s ,i pentru a cripta cont ,inutul dispozitivului mobil. Pân ˘a de
curând, codul ce acces era format din patru cifre. Cu toate acestea, deoarece deblocarea dispozi-
tivelor mobile cu amprenta digital ˘a cu ID Touch-ul a devenit mai r ˘aspândit, codul de acces de s ,ase
cifre este implicit odat ˘a cu lansarea iOS 10, cu opt ,iunea de a trece din nou la codul de patru cifre
sau de a folosi un cod de acces alfanumeric.
Touch ID
Touch ID-ul este un scanner de amprente, care este încorporat în butonul de "Home" s ,i poate
fi folosit pentru a debloca dispozitivul, pentru a face achizit ,ii s,i pentru a se conecta la anumite
aplicat ,ii, printre alte funct ,ii. Atunci când este utilizat, Touch ID-ul stocheaz ˘a temporar datele am-
prentei digitale în memoria criptat ˘a în Enclave Secure, descris anterior. Datele amprentei digitale
nu se pot obt ,ine din procesorul principal sau orice alt ˘a parte a sistemului.
Address Space Layout Randomization
Address Space Layout Randomization (ASLR) este o tehnic ˘a de nivel sc ˘azut pentru prevenirea
atacurilor de corupt ,ie a memoriei, precum buffer overflow. Acesta implic ˘a introducerea datelor în
locat ,iile selectate aleator în memorie cu scopul de a îngreuna modurile de corupere s ,i exploatare
a sistemului. ASLR este responsabil pentru închiderea aplicat ,iilor în locul suprascrierii memoriei,
atunci când aplicat ,iile au anumite erori, indiferent dac ˘a respectivul comportament este accidental
sau r ˘au intent ,ionat.
Non-Executable Memory
iOS utilizeaz ˘a caracteristica Execute Never (XN) a arhitecturii ARM. Acesta permite ca un-
ele port ,iuni ale memoriei s ˘a fie marcate ca fiind non-executabile, lucrând al ˘aturi de ASLR pentru a
preveni atacurile buffer overflow, incluzând atacurile return-to-libc.
3
VEGHIU Sorin-Andrei
Criptare
Dup˘a cum a fost ment ,ionat mai sus, criptarea se utilizeaz ˘a în memoria Secure Enclave în iOS.
Atunci când o parol ˘a este utilizat ˘a pe un dispozitiv iOS, cont ,inutul dispozitivului este criptat.
Acest ˘a criptare se poate realiza utilizând implementarea hardware AES 256, care este foarte efi-
cient ˘a, deoarece acesta este pozit ,ionat între memoria RAM s ,i memoriei flash.
Keychain
iOS Keychain este o baz ˘a de date ce cont ,ine infomat ,ii de conectare, care pot fi partajate în-
tre aplicat ,iile scrise de aceeas ,i persoan ˘a sau organizat ,ie. Acest serviciu este adesea folosit pentru
stocarea parolelor pentru aplicat ,iile web.
App Security
Aplicat ,iile third-party, cum ar fi cele distribuite prin intermediul App Store trebuie s ˘a fie semnate
cu codul certificatului Apple emis. Acesta continu ˘a "lant ,ul de încredere" pornind de la procesul de
Secure Boot as ,a cum s-a ment ,ionat mai sus la act ,iunile aplicat ,iilor instalate pe dispozitive de c ˘atre
utilizatori. Aplicat ,iile sunt, de asemenea, sandboxed, adic ˘a pot modifica doar datele din directorul
lor individual de origine, cu except ,ia cazului în care le este dat ˘a explicit permisiunea. De exemplu,
aplicat ,iile nu pot accesa datele care apart ,in altor aplicat ,ii instalate pe dispozitiv de c ˘atre utilizator.
Exist ˘a un set foarte extins de controale de confident ,ialitate cont ,inute în iOS, cu opt ,iuni pentru a
controla capacitatea aplicat ,iilor de a avea acces la o gam ˘a larg ˘a de permisiuni, cum ar fi camera
foto, date de contact, actualizarea aplicat ,iilor în fundal, transferul de date mobile, precum s ,i ac-
cesul la alte date s ,i servicii. Marea parte din codul iOS, incluzând aplicat ,iile third-party, ruleaz ˘a
precum utilizatorul "mobil", care nu are privilegii de root. Acest lucru asigur ˘a faptul c ˘a fis ,ierele
de sistem s ,i alte resurse de sistem iOS r ˘amân ascunse s ,i inaccesibile pentru aplicat ,iile instalate de
c˘atre utilizator.
Network Security
iOS suport ˘a TLS cu ambele API-uri de nivel sc ˘azut s ,i de nivel înalt pentru programatori. În
mod implicit, framework-ul App Transport Security necesit ˘a ca serverele s ˘a foloseasc ˘a cel put ,in
TLS versiunea 1.2. Cu toate acestea, programatorii sunt liberi pentru a trece peste acest cadru s ,i
s˘a utilizeze propriile metode de comunicare prin intermediul ret ,elelor. Atunci când Wi-Fi-ul este
activat, iOS utilizeaz ˘a o adres ˘a MAC aleatoare astfel încât dispozitivele nu pot fi depistate de c ˘atre
niciun urm ˘aritor de trafic wireless.
Two-Factor Authentication
Autentificarea cu doi factori este o opt ,iune în iOS pentru a se asigura c ˘a, în cazul în care o per-
soan ˘a neautorizat ˘a cunoas ,te ID-ul Apple s ,i parola, nu vor putea obt ,ine accesul la cont. Funct ,ioneaz ˘a
nu doar prin necesitarea parolei s ,i ID-ului Apple, dar s ,i un cod de verificare care este trimis pe un
dispozitiv de încredere. Dac ˘a un utilizator neautorizat încearc ˘a s˘a se conecteze utilizând ID-ul Ap-
4
VEGHIU Sorin-Andrei
ple al unui alt utilizator, proprietarul ID-ului Apple va primi o notificare ce îi permite s ˘a refuze
accesul dispozitivului necunoscut.
1.4 Arhitectura iOS
Arhitectura iOS este stratificat ˘a. La cel mai înalt nivel, iOS act ,ioneaz ˘a ca intermediar în-
tre hardware-ul de baz ˘a s,i aplicat ,iile ce sunt create. Aplicat ,iile comunic ˘a cu hardware-ul print-
r-un set de interfet ,e de sistem bine definite. Aceste interfet ,e faciliteaz ˘a scrierea de aplicat ,ii care
funct ,ioneaz ˘a în mod consistent pe dispozitive care au diferite capabilit ˘at,i hardware.
Fig. 1: Straturile iOS
Implementarea tehnologiilor iOS poate fi privit ˘a ca un set de straturi (prezentate în Fig.
1.1). Straturile inferioare cont ,in servicii s ,i tehnologii fundamentale. Straturile de nivel superior
se bazeaz ˘a pe straturile inferioare s ,i ofer ˘a servicii s ,i tehnologii mai sofisticate.
Tehnologiile iOS sunt împachetate în framework-uri. Un framework este un director care cont ,ine
o bibliotec ˘a partajat ˘a dinamic s ,i resursele (precum fis ,iere header, imagini s ,i aplicat ,ii ajut ˘atoare)
necesare pentru a sprijini biblioteca respectiv ˘a.
1.4.1 Stratul Cocoa Touch
Stratul Cocoa Touch cont ,ine framework-uri cheie pentru realizarea aplicat ,iilor iOS. Aceste
framework-uri definesc aspectul aplicat ,iilor. De asemenea, acestea ofer ˘a infrastructura de baz ˘a
pentru aplicat ,ii s,i suport pentru tehnologii cheie, precum multitasking, input touch-based, notificari
push s ,i multe servicii de sistem la nivel înalt.
1.4.1.1 Caracteristici de nivel înalt
Urm ˘atoarele sect ,iuni descriu unele dintre tehnologiile cheie disponibile în stratul Cocoa
Touch.
5
VEGHIU Sorin-Andrei
Extensii de aplicat ,ii
iOS 8 v ˘a permite s ˘a extindet ,i zonele selectate ale sistemului furnizând o extensie de aplicat ,ie,
care reprezint ˘a un cod ce permite funct ,ionalitatea personalizat ˘a în contextul unei sarcini a utiliza-
torului. De exemplu, se poate furniza o extensie de aplicat ,ie care îi ajut ˘a pe utilizatori s ˘a posteze
cont ,inut pe site-urile de socializare. Dup ˘a ce utilizatorii instaleaz ˘a s,i activeaz ˘a aceast ˘a extensie, o
pot alege atunci când apas ˘a pe butonul Share din aplicat ,ia curent ˘a. Extensia de distribuire personal-
izat˘a furnizeaz ˘a codul care accept ˘a, valideaz ˘a s,i public ˘a cont ,inutul utilizatorului. Sistemul listeaz ˘a
extensia din meniul de partajare s ,i o instant ,eaz˘a atunci când utilizatorul o alege.
În Xcode, creat ,i o extensie de aplicat ,ie ad ˘augând o destinat ,ie de extensie preconfigurat ˘a pentru
aplicat ,ie. Dup ˘a ce un utilizator instaleaz ˘a o aplicat ,ie care cont ,ine o extensie, extensia poate fi acti-
vat˘a de utilizator în aplicat ,ia denumit ˘a Set ˘ari. Când utilizatorul execut ˘a alte aplicat ,ii, sistemul face
ca extensia activat ˘a s˘a fie disponibil ˘a în interfat ,a de sistem corespunz ˘atoare, cum ar fi meniul Share.
iOS accept ˘a extensii de aplicat ,ii pentru urm ˘atoarele zone, cunoscute sub numele de puncte de
extensie:
Share – putet ,i distribui cont ,inut pe ret ,elele de socializare sau alte entit ˘at,i.
Action – efectuat ,i o sarcin ˘a simpl ˘a utilizând cont ,inutul curent.
Widget – furnizat ,i o actualizare rapid ˘a sau activat ,i o scurt ˘a activitate în Today view a Centru-
lui de Notificare.
Photo editing – efectuat ,i modific ˘ari pentru o fotografie sau un videoclip în aplicat ,ia Fotografii.
Document provider – furnizat ,i o locat ,ie de stocare a documentelor care poate fi accesat ˘a de
alte aplicat ,ii. Aplicat ,iile care utilizeaz ˘a un controler de vizualizare a selectorului de docu-
mente pot deschide fis ,ierele gestionate de Furnizorul de documente sau pot muta fis ,ierele în
Document Provider.
Custom keyboard – furnizat ,i o tastatur ˘a personalizat ˘a pe care utilizatorul o poate alege în
locul tastaturii de sistem pentru toate aplicat ,iile de pe dispozitiv.
Fiecare punct de extensie defines ,te API-urile corespunz ˘atoare pentru scopurile sale. Când
utilizat ,i un s ,ablon de extensie de aplicat ,ie pentru a începe dezvoltarea, obt ,inet ,i o t ,int˘a implicit ˘a
care cont ,ine set ˘ari de metode s ,i set˘ari ale listelor de propriet ˘at,i definite de punctul de extensie pe
care l-at ,i ales.
Handoff
Handoff este un feature în OS X s ,i iOS care extinde experient ,a utilizatorilor de continuitate
pe toate dispozitivele. Handoff permite utilizatorilor s ˘a înceap ˘a o activitate pe un singur dispozitiv,
apoi s ˘a treac ˘a la alt dispozitiv s ,i s˘a reia aceeas ,i activitate pe cel ˘alalt dispozitiv. De exemplu, un
utilizator care navigheaz ˘a într-un articol lung din Safari se mis ,c˘a într-un dispozitiv iOS care este
6
VEGHIU Sorin-Andrei
conectat la acelas ,i ID Apple s ,i aceeas ,i pagin ˘a se deschide automat în Safari pe iOS, cu aceeas ,i
pozit ,ie de defilare ca s ,i pe dispozitivul original. Handoff face ca aceast ˘a experient ,˘a s˘a fie f ˘ar˘a prob-
leme.
Handoff permite utilizatorilor s ˘a înceap ˘a o activitate pe un singur dispozitiv, apoi s ˘a treac ˘a la
alt dispozitiv s ,i s˘a reia aceeas ,i activitate pe cel ˘alalt dispozitiv. De exemplu, un utilizator care nav-
igheaz ˘a într-un articol lung din Safari se mis ,c˘a într-un dispozitiv iOS care este conectat la acelas ,i
ID Apple s ,i aceeas ,i pagin ˘a se deschide automat în Safari pe iOS, cu aceeas ,i pozit ,ie de defilare ca
s,i pe dispozitivul original. Handoff face ca aceast ˘a experient ,˘a s˘a fie f ˘ar˘a probleme.
Pentru a participa la Handoff, o aplicat ,ie adopt ˘a un mic API în cadrul Foundation. Fiecare activ-
itate în desf ˘as,urare dintr-o aplicat ,ie este reprezentat ˘a de un obiect de activitate al utilizatorului care
cont ,ine datele necesare pentru a relua activitatea pe un alt dispozitiv. Când utilizatorul alege s ˘a reia
activitatea respectiv ˘a, obiectul este trimis c ˘atre dispozitivul de reluare. Fiecare obiect de activitate
al utilizatorului are un obiect delegat care este invocat pentru a reîmprosp ˘ata starea activit ˘at,ii la
momente potrivite, cum ar fi chiar înainte ca obiectul de activitate al utilizatorului s ˘a fie trimis între
dispozitive.
Dac˘a continuarea unei activit ˘at,i necesit ˘a mai multe date decât cele ce sunt transferate cu us ,urint ,˘a
de c˘atre obiectul de activitate al utilizatorului, aplicat ,ia de reluare are opt ,iunea de a deschide un flux
c˘atre aplicat ,ia original ˘a. Aplicat ,iile bazate pe documente accept ˘a automat continuarea activit ˘at,ii
pentru utilizatorii care lucreaz ˘a cu documente bazate pe iCloud.
Document Picker
View controller-ul document picker-ului (UIDocumentPickerViewController) permite accesul
utilizatorilor la fis ,iere în afara spat ,iului de lucru al aplicat ,iei. Este un mecanism simplu pentru par-
tajarea documentelor între aplicat ,ii. De asemenea, permite fluxuri de lucru mai complexe, deoarece
utilizatorii pot edita un singur document cu mai multe aplicat ,ii.
Document picker-ul v ˘a permite s ˘a accesat ,i fis ,iere de la un num ˘ar de furnizori de documente. De
exemplu, furnizorul de documente iCloud acord ˘a acces la documente stocate în containerul iCloud
al unei alte aplicat ,ii. Programatorii third-party pot furniza furnizori de documente suplimentari
utilizând extensia Storage Provider.
Airdrop
AirDrop permite utilizatorilor s ˘a partajeze fotografii, documente, adrese URL s ,i alte tipuri de
date cu dispozitivele din apropiere. Suportul pentru a trimite fis ,iere c ˘atre alte dispozitive iOS ce
folosesc AirDrop este integrat în clasa UIActivityViewController. Aceast ˘a clas ˘a afis ,eaz˘a diferite
opt,iuni pentru partajarea cont ,inutului pe care îl specificat ,i.
Pentru a primi fis ,iere transmise prin AirDrop, aplicat ,ia trebuie s ˘a satisfac ˘a urm ˘atoarele condit ,ii:
Declar ˘a suport pentru tipurile de documente corespunz ˘atoare în Xcode, deoarece acesta
7
VEGHIU Sorin-Andrei
adaug ˘a cheile Info.plist fis ,ierul Info.plist al Info.plist aplicat ,iei. Sistemul utilizeaz ˘a aceste
informat ,ii pentru a determina dac ˘a aplicat ,ia poate deschide un anumit fis ,ier.
Implementat ,i metoda application:openURL:sourceApplication:annotation în AppDelegate,
astfel sistemul foloses ,te metoda atunci când un nou fis ,ier este primit.
Fis,ierele trimise pe aplicat ,ie sunt ad ˘augate în directorul Home/Documents/Inbox al aplicat ,iei.
Dac˘a dorit ,i s˘a modificat ,i fis ,ierul, trebuie s ˘a îl mutat ,i în afara directorului. Fis ,ierele stocate în acest
director sunt criptate utilizând protect ,ia datelor, as ,adar fis ,ierele vor fi inaccesibile dac ˘a dispozitivul
este blocat.
TextKit
TextKit este un set complet de clase de nivel înalt pentru manipularea textului s ,i a tipografiei
fine. Folosind TextKit, se poate amenaja textul în paragrafe, coloane s ,i pagini. Putet ,i rula text în
jurul unor regiuni arbitrare, cum ar fi grafica s ,i îl putet ,i utiliza pentru a gestiona mai multe fonturi.
TextKit este integrat cu toate controalele bazate pe text în UIKit pentru a permite aplicat ,iilor s ˘a
creeze, s ˘a editeze, s ˘a afis ,eze s ,i s˘a stocheze mai us ,or textul s ,i cu un num ˘ar mai mic de cod decât era
posibil anterior în iOS.
TextKit cuprinde clase noi UIKit, împreun ˘a cu extensii la clasele existente, inclusiv urm ˘atoarele:
Clasa NSAttributedString a fost extins ˘a pentru a suporta atribute noi.
Clasa NSLayoutManager genereaz ˘a glyph-uri s ,i afis ,eaz˘a text.
Clasa NSTextContainer o regiune în care este NSTextContainer textul.
Clasa NSTextStorage defines ,te interfat ,a fundamental ˘a pentru gestionarea cont ,inutului bazat
pe text.
UIKit Dynamics
Aplicat ,iile pot specifica comportamente dinamice pentru obiectele UIView s ,i pentru alte obiecte
care sunt conforme cu UIDynamicItem. Comportamentele dinamice ofer ˘a o modalitate de a îmbun ˘at˘at,i
experient ,a utilizatorului aplicat ,iei, încorporând comportamentul s ,i caracteristicile din lumea real ˘a
în interfat ,a de utilizare a aplicat ,iei. Dinamica UIKit accept ˘a urm ˘atoarele tipuri de comportamente:
Un obiect UIAttachmentBehavior specific ˘a o conexiune între dou ˘a elemente dinamice sau
între un element s ,i un punct. Când un element (sau un punct) se mis ,c˘a, elementul atas ,at
se mis ,c˘a s,i el. Conexiunea nu este totus ,i complet static ˘a. Un comportament de atas ,ament
are propriet ˘at,i de amortizare s ,i oscilat ,ie care determin ˘a modul în care comportamentul se
schimb ˘a în timp.
Un obiect UICollisionBehavior permite elementelor dinamice s ˘a participe la coliziuni între
ele s ,i cu limitele specificate de comportament. De asemenea, comportamentul le permite
acelor elemente s ˘a react ,ioneze corespunz ˘ator la coliziuni.
8
VEGHIU Sorin-Andrei
Un obiect UIGravityBehavior specific ˘a un vector de gravitat ,ie pentru elementele sale dinam-
ice. Elementele dinamice accelereaz ˘a în direct ,ia vectorului pân ˘a când se ciocnesc cu alte
elemente configurate corespunz ˘ator sau ating o limit ˘a.
Un obiect UIPushBehavior specific ˘a un vector de fort ,˘a continu ˘a sau instantanee pentru ele-
mentele sale dinamice.
Un obiect UISnapBehavior specific ˘a un punct de fixare pentru un element dinamic. Elemen-
tul se fixeaz ˘a la punct cu un efect configurat. De exemplu, un element dinamic se poate
apropia de punct ca s ,i cum ar fi atas ,at la un resort.
Comportamentele dinamice devin active atunci când le ad ˘augat ,i la un obiect animator, care este
o instant ,˘a a clasei UIDynamicAnimator . Animatorul ofer ˘a contextul în care comportamentele
dinamice se execut ˘a. Un element dinamic dat poate avea mai multe comportamente, dar toate
aceste comportamente trebuie s ˘a fie animate de acelas ,i obiect animator.
Multitasking
Durata de viat ,˘a a bateriei este un aspect important pentru utilizatorii dispozitivelor iOS, iar mod-
elul multitasking din iOS este proiectat pentru a maximiza durata de viat ,˘a a bateriei, oferind în
acelas ,i timp aplicat ,iilor timpul necesar pentru a face o activitate critic ˘a. Când utilizatorul apas ˘a
butonul Acas ˘a, aplicat ,ia din prim-plan se deplaseaz ˘a la un context de execut ,ie de fundal. Dac ˘a
aplicat ,ia nu mai are de lucru, este suspendat ˘a de execut ,ia activ ˘a s,i pus ˘a într-o stare "freeze-dried",
unde r ˘amâne în memorie, dar nu execut ˘a nici un cod. Aplicat ,iile care au nevoie de anumite tipuri
de lucru pot solicita sistemului timp de execut ,ie pe fundal. Spre exemplu:
O aplicat ,ie poate solicita o perioad ˘a finit ˘a de timp pentru a finaliza o sarcin ˘a important ˘a.
O aplicat ,ie care accept ˘a anumite servicii (cum ar fi redarea audio) poate solicita timp pentru
a furniza aceste servicii.
O aplicat ,ie poate utiliza notific ˘ari locale pentru a genera alerte de utilizator la anumite ore,
indiferent dac ˘a aplicat ,ia este sau nu în desf ˘as,urare.
O aplicat ,ie poate desc ˘arca periodic cont ,inut din ret ,ea.
O aplicat ,ie poate desc ˘arca cont ,inut ca r ˘aspuns la o notificare push.
Auto Layout
Auto Layout este folositor pentru a crea interfet ,e dinamice cu o dimensiune mic ˘a a codului.
Folosind Auto Layout, definit ,i reguli pentru a stabili elementele din interfat ,a de utilizator. Aceste
reguli exprim ˘a o clas ˘a mai mare de relat ,ii s,i sunt mai intuitive de utilizat decât modelul resorturilor
care a fost folosit anterior. De exemplu, putet ,i specifica faptul c ˘a un buton este întotdeauna de 20
de puncte de la marginea din stânga a view-ului s ˘au p˘arinte.
Entit ˘at,ile utilizate în Auto Layout sunt obiecte Obiect-C numite constrângeri . Constrângerile
ofer˘a mai multe avantaje:
9
VEGHIU Sorin-Andrei
Suport ˘a localizarea prin schimbarea s ,irurilor, în loc s ˘a solicite s ˘a v˘a actualizat ,i layout-ul.
sust ,in oglindirea elementelor de interfat ,˘a cu utilizatorul pentru limbile de la dreapta la stânga,
precum ebraica s ,i araba.
promoveaz ˘a o mai bun ˘a separare a responsabilit ˘at,ilor între obiectele din stratul vizual s ,i
controller.
Un obiect de tip view, de obicei, are valori pentru m ˘arimea sa standard, pozit ,ionarea în su-
perview s ,i pozit ,ionarea relativ ˘a în raport cu view-urile rudelor sale. Un view controller poate
suprascrie aceste valori dac ˘a un aspect nonstandard este necesar.
Storyboards
Storyboards sunt modalitatea recomandat ˘a de a proiecta interfat ,a de utilizare a aplicat ,iei. Sto-
ryboards v ˘a permit s ˘a proiectat ,i întreaga interfat ,˘a de utilizator într-un singur loc, pentru a putea
vedea toate view-urile s ,i view controller-ele s ,i pentru a înt ,elege cum funct ,ioneaz ˘a împreun ˘a. O
parte important ˘a a storyboard-urilor este abilitatea de a defini segue-uri, care sunt tranzit ,ii de la un
view controller la altul. Aceste tranzit ,ii permit capturarea fluxului interfet ,ei de utilizator, în plus
fat,˘a de cont ,inut. Putet ,i defini aceste tranzit ,ii vizual, în Xcode, sau le putet ,i init ,ia programabil.
Putet ,i utiliza un singur fis ,ier storyboard pentru a stoca tot ,i view controller-i s ,i toate view-urile
aplicat ,iei sau putet ,i utiliza mai multe storyboard-uri pentru a organiza port ,iuni din interfat ,˘a. Atunci
când aplicat ,ia se build-uies ,te, Xcode ia cont ,inutul fis ,ierului storyboard s ,i îl împarte în buc ˘at,i dis-
crete care pot fi înc ˘arcate individual pentru o performant ,˘a mai bun ˘a. Aplicat ,ia nu trebuie s ˘a manip-
uleze direct aceste piese. Framework-ul UIKit ofer ˘a clase ajut ˘atoare pentru accesarea cont ,inutului
unui storyboard din codul aplicat ,iei.
UI State Preservation
State preservation semnific ˘a faptul c ˘a aplicat ,ia pare c ˘a ruleaz ˘a mereu, chiar s ,i în fundal, chiar
dac˘a nu este as ,a. Dac ˘a sistemul întâmpin ˘a presiune asupra memoriei, atunci este posibil sa fie
nevoit s ˘a închid ˘a una sau mai multe aplicat ,ii din fundal. Atunci când o aplicat ,ie se mis ,c˘a din prim-
plan în fundal, poate p ˘astra starea view-urilor s ,i a view controller-ilor. În timpul urm ˘atorului s ˘au
ciclu de lansare, poate utiliza acea informat ,ie de stare p ˘astrat ˘a pentru a-s ,i restabili view-urile s ,i
view controller-i la configurat ,iile anterioare s ,i a face s ˘a par ˘a ca s ,i cum aplicat ,ia nu ar fi fost închis ˘a
niciodat ˘a.
Serviciul de notificare Apple Push
Serviciul de notificare Apple Push ofer ˘a o modalitate de a alerta utilizatorii despre informat ,ii
noi, chiar s ,i atunci când aplicat ,ia nu ruleaz ˘a în mod activ. Folosind acest serviciu, putet ,i s˘a facet ,i
notific ˘ari text, s ˘a ad˘augat ,i o insign ˘a în pictograma aplicat ,iei sau s ˘a declans ,at,i alerte sonore pe dis-
pozitivele utilizatorilor în orice moment. Aceste mesaje permit utilizatorilor s ˘a fie notificat ,i c˘a ar
trebui s ˘a deschid ˘a aplicat ,ia pentru a primi informat ,iile asociate. În iOS 7, putet ,i chiar s ˘a împinget ,i
10
VEGHIU Sorin-Andrei
notific ˘arile silent ,ioase pentru a permite aplicat ,iei s˘a fie la curent cu faptul c ˘a un nou cont ,inut este
disponibil pentru desc ˘arcare.
Din punct de vedere al design-ului, exist ˘a dou ˘a p˘art,i pentru a face notific ˘arile push s ˘a funct ,ioneze
pentru aplicat ,iile iOS. Mai întâi, aplicat ,ia trebuie s ˘a solicite primirea notific ˘arilor s ,i s˘a prelucreze
datele de notificare odat ˘a livrate. În al doilea rând, trebuie s ˘a oferit ,i un proces server-side pentru
a genera notific ˘arile. Acest proces tr ˘aies ,te pe serverul local s ,i lucreaz ˘a cu serviciul de notificare
Apple Push pentru a declans ,a notific ˘arile.
Notific ˘ari locale
Notific ˘arile locale completeaz ˘a mecanismul de notificare push existent, oferind aplicat ,iilor o
modalitate de a genera notific ˘arile la nivel local, în loc s ˘a se bazeze pe un server extern. Aplicat ,iile
care ruleaz ˘a în fundal pot utiliza notific ˘arile locale ca o modalitate de a atrage atent ,ia utilizatorului
atunci când se întâmpl ˘a evenimente importante. De exemplu, o aplicat ,ie de navigare care ruleaz ˘a
în fundal poate utiliza notific ˘ari locale pentru a avertiza utilizatorul când este timpul s ˘a fac ˘a o în-
toarcere. Aplicat ,iile pot programa, de asemenea, livrarea notific ˘arilor locale pentru o dat ˘a s,i o or ˘a
viitoare s ,i s˘a le transmit ˘a notific ˘arile chiar dac ˘a aplicat ,ia nu este difuzat ˘a.
Un avantaj al notific ˘arilor locale este c ˘a acestea sunt independente de aplicat ,ie. Dup ˘a ce este
programat ˘a o notificare, sistemul gestioneaz ˘a livrarea acestuia. Aplicat ,ia nu trebuie s ˘a fie pornit ˘a
atunci când notificarea este livrat ˘a.
Gesture Recognizers
Recunoas ,terea gesturilor identific ˘a tipurile obis ,nuite de gesturi, precum swipe-urile sau pinch-
urile din view-ul aplicat ,iei. Deoarece folosesc aceleas ,i euristici ca s ,i sistemul de detectare a ges-
turilor, recunoas ,terea gesturilor ofer ˘a un comportament consistent pentru aplicat ,ii. Pentru a utiliza
un astfel de gesture recognizer, atas ,at,i recunoas ,terea unui anumit gest la view s ,i dat ,i-i o metod ˘a
de act ,iune pentru a se efectua atunci când are loc gestul. Recunoas ,terea gesturilor îngreuneaz ˘a
urm˘arirea evenimentelor brute s ,i de determinare a momentului în care acestea constituie gestul
intent ,ionat.
Toat˘a recunoas ,terea gesturilor se bazeaz ˘a pe clasa UIGestureRecognizer, care defines ,te compor-
tamentul de baz ˘a. UIKit furnizeaz ˘a subclase standard de recunoas ,tere a gesturilor pentru a detecta
atingerile, pinch-urile, pan-urile, swipe-urile s ,i rotat ,iile. De asemenea, putet ,i adapta comportamen-
tul celor mai mult ,i gesture recognizeri la nevoile aplicat ,iei respective. De exemplu, putet ,i seta un
gesture recognizer pentru detectarea unui anumit num ˘ar de atingeri înainte de a apela o anumit ˘a
metoda de act ,iune.
Standard System View Controllers
Multe framework-uri de sistem definesc view controller-i. Este recomandat s ˘a se foloseasc ˘a
view controller-i existent ,i pentru framework-ul corespunz ˘ator:
11
VEGHIU Sorin-Andrei
Pentru afis ,area sau editarea informat ,iilor de contact – utilizat ,i view controller-i din framework-
ul Address Book UI.
Pentru crearea sau editarea evenimentelor din calendar – utilizat ,i view controller-i din framework-
ul EventKit UI.
Pentru compunerea unui e-mail sau a unui mesaj SMS – utilizat ,i view controller-i din framework-
ul Message UI.
Pentru deschiderea sau vizualizarea cont ,inutului unui document – utilizat ,i clasa UIDocu-
mentInteractionController din framework-ul UIKit
Pentru a face o fotografie sau pentru a alege una din biblioteca foto a utilizatorului – utilizat ,i
clasa UIImagePickerController din framework-ul UIKit.
Pentru a filma un videoclip – utilizat ,i clasa UIImagePickerController din framework-ul UIKit.
1.4.1.2 Framework-urile Cocoa Touch
Urm ˘atoarele sect ,iuni descriu framework-urile stratului Cocoa Touch s ,i serviciile pe care
acestea le ofer ˘a.
Framework-ul Address Book UI
Framework-ul Address Book UI (AddressBookUI.framework) este o interfat ,˘a de programare
Objective-C s ,i Swift pe care o putet ,i utiliza pentru a afis ,a interfet ,ele standard de sistem pentru a
crea noi contacte s ,i pentru a edita s ,i selecta contactele existente. Acest framework simplific ˘a modul
în care se afis ,eaz˘a informatiile despre contacte într-o aplicat ,ie s ,i asigur ˘a, de asemenea, faptul c ˘a
utlilizeaz ˘a aceleas ,i interfet ,e precum alte aplicat ,ii, realizând o coerent ,˘a în cadrul platformei.
Framework-ul EventKit
Framework-ul (EventKitUI.framework) ofer ˘a view controller-i pentru prezentarea interfet ,elor
standard de sistem s ,i pentru editarea evenimentelor din calendar.
Framework-ul GameKit
Framework-ul GameKit (Gamekit.framework) implementeaz ˘a suportul pentru Game Center, care
permite utilizatorilor s ˘a-s,i împ ˘art˘as,easc˘a online informat ,iile legate despre diverse jocuri. Game
Center ofer ˘a suport pentru urm ˘atoarele caracteristici:
Aliasuri – pentru a permite utilizatorilor s ˘a-s,i creeze propriul personaj online. Utilizatorii se
conecteaz ˘a la Game Center s ,i pot interact ,iona cu ceilalt ,i juc˘atori în mod anonim prin aliasul
lor. Juc ˘atorii pot seta mesaje de stare s ,i pot marca anumite persoane ca fiind prietenii lor.
12
VEGHIU Sorin-Andrei
Leaderboard-uri – pentru a permite aplicat ,iei s˘a posteze scoruri pentru utilizatori în Game
Center s ,i s˘a le recupereze mai târziu. Se poate utiliza aceast ˘a funct ,ie pentru a afis ,a cele mai
bune scoruri dintre tot ,i utilizatorii aplicat ,iei.
Matchmaking – pentru a v ˘a permite s ˘a creat ,i jocuri multiplayer prin conectarea juc ˘atorilor
care sunt conectat ,i la Game Center. Juc ˘atorii nu trebuie s ˘a fie locali pentru a se al ˘atura unui
joc multiplayer.
Achievements – pentru a v ˘a permite s ˘a înregistrat ,i progresul pe care un juc ˘ator l-a facut pentru
un anumit joc.
Challenges – pentru a permite unui juc ˘ator s ˘a provoace un prieten în a îndeplini un achieve-
ment sau a dep ˘as,i un scor.
Turn-based gaming – pentru a crea meciuri persistente a c ˘aror stare este stocat ˘a în iCloud.
Framework-ul iAd
Framework-ul iAd (iAd.framework) permite s ˘a furnizat ,i anunt ,uri bazate pe bannere în aplicat ,ie.
Anunt ,urile sunt încorporate în view-urile standard pe care le integrat ,i în interfat ,a de utilizator s ,i
afis ,at,i atunci când dorit ,i. View-urile îns ,is,i lucreaz ˘a cu serviciul iAd al Apple pentru a gestiona
automat toate lucr ˘arile asociate cu înc ˘arcarea s ,i prezentarea anunt ,urilor media îmbog ˘at,ite s ,i pentru
a r˘aspunde la interceptarea acestor anunt ,uri.
Framework-ul MapKit
Framework-ul MapKit (MapKit.framework) ofer ˘a o hart ˘a scalabil ˘a pe care o putet ,i încorpora în
interfat ,a de utilizare aplicat ,iei. Dincolo de afis ,area unei h ˘art,i, putet ,i utiliza framework-ul intefet ,elor
pentru a personaliza cont ,inutul s ,i aspectul h ˘art,ii. Se pot ad ˘auga puncte de interes folosind adnot ˘ari
s,i se pot utiliza suprapuneri personalizate pentru a împ ˘art˘as,i cont ,inutul propriu cu cont ,inutul h ˘art,ii.
Spre exemplu, se poate utiliza o suprapunere pentru a trasa un traseu de autobuz sau se pot utiliza
adnot ˘ari pentru a evident ,ia magazinele si restaurantele din apropiere.
Pe lâng ˘a afis ,area h ˘art,ilor, framework-ul MapKit se integreaz ˘a cu aplicat ,ia H˘art,i s,i cu serverele
de h˘art,i Apple pentru a facilita indicat ,iile de orientare. Din aplicat ,ia H˘art,i Google, utilizatorii pot
s˘a delege furnizarea de indicat ,ii de orientare c ˘atre orice aplicat ,ie care accept ˘a indicat ,ii de orientare.
Aplicat ,iile care ofer ˘a tipuri de direct ,ii specializate, cum ar fi rute de metrou, se pot înregistra
pentru a le oferi aceste indicat ,ii atunci când sunt solicitate. Aplicat ,iile pot solicita, de asemenea,
instruct ,iuni de mers pe jos s ,i de conducere de la serverele Apple s ,i îmbinarea acelor informat ,ii
despre trase cu instruct ,iunile personalizate pentru a oferi o experient ,˘a complet ˘a punct-la-punct
pentru utilizator.
Framework-ul Message UI
Framework-ul Message UI (MessageUI.framework) ofer ˘a suport pentru compunerea mesajelor
e-mail sau SMS din aplicat ,ia ce o utlizeaz ˘a. Suportul compozit ,iei const ˘a într-o interfat ,˘a a view
13
VEGHIU Sorin-Andrei
controller-ului pe care o putet ,i prezenta în aplicat ,ie. Putet ,i s˘a completat ,i câmpurile acestui view
controller pentru a seta destinatarii, subiectul, cont ,inutul mesajului s ,i orice atas ,˘ari pe care dorit ,i
s˘a le includet ,i în mesaj. Dup ˘a prezentarea view controller-ului, utilizatorul are apoi opt ,iunea de a
edita mesajul înainte de al trimite.
Framework-ul PushKit
Framework-ul PushKit (PushKit.framework) ofer ˘a suport de înregistrare pentru aplicat ,iile V oIP.
Acest framework înlocuies ,te API-urile anterioare pentru înregistrarea aplicat ,iilor V oIP. În loc s ˘a
ment ,inet ,i o conexiune persistent ˘a deschis ˘a s,i, astfel, s ˘a mics ,orat ,i durata bateriei dispozitivului, o
aplicat ,ie poate folosi acest framework pentru a primi notific ˘ari push atunci când exist ˘a un apel
primit.
Framework-ul UIKit
Framework-ul UIKit (UIKit.framework) ofer ˘a infrastructura pentru implementarea aplicat ,iilor
grafice, bazate pe evenimente în iOS, inclusiv urm ˘atoarele:
Gestionarea s ,i infrastructura de baz ˘a a aplicat ,iilor, incluzând bucla principal ˘a a aplicat ,iei
Gestionarea interfet ,ei utilizator, inclusiv suport pentru storyboard-uri s ,i fis ,iere nib
Un model de view controller pentru a încapsula cont ,inutul interfet ,ei de utilizator
Obiecte reprezentând view-urile s ,i controalele standard ale sistemului
Suport pentru manipularea evenimentelor bazate pe atingere s ,i mis ,care
Suport pentru un model de document care include integrarea iCloud
Suport grafic s ,i ferestre, inclusiv suport pentru afis ,aje externe
Suport multitasking
Suport pentru imprimare
Suport pentru personalizarea aspectului comenzilor standard UIKit
Suport pentru text s ,i cont ,inut web
Suport pentru animarea cont ,inutului de interfat ,˘a cu utilizatorul
Integrarea cu alte aplicat ,ii din sistem prin scheme de adrese URL s ,i interfet ,e cadru
Accesibilitate pentru utilizatorii cu handicap
Suport pentru serviciul Apple Push Notification
Planificare s ,i livrare la nivel local
14
VEGHIU Sorin-Andrei
Crearea PDF-urilor
Suport pentru utilizarea vederilor personalizate de intrare, care se comport ˘a ca s ,i tastatura
sistemului
Suport pentru crearea de vizualiz ˘ari de text personalizate, care interact ,ioneaz ˘a cu tastatura
sistemului
Sprijin pentru partajarea cont ,inutului prin e-mail, Twitter, Facebook s ,i alte servicii
1.4.2 Stratul Media
Stratul Media cont ,ine tehnologiile grafice, audio s ,i video care sunt utilizate pentru implementarea
experient ,elor multimedia în aplicat ,ii.
1.4.2.1 Tehnologii grafice
Grafica de înalt ˘a calitate reprezint ˘a o parte important ˘a a tuturor aplicat ,iilor, iar iOS ofer ˘a nu-
meroase tehnologii care v ˘a ajut ˘a s˘a v˘a punet ,i pe ecran arta s ,i grafica personalizat ˘a. Tehnologiile
grafice iOS ofer ˘a o gam ˘a larg ˘a de suport, care lucreaz ˘a perfect cu arhitectura vizual ˘a UIKit pentru
a us ,ura difuzarea cont ,inutului. Tehnologiile grafice în iOS sunt urm ˘atoarele:
UIKit graphics – defines ,te suportul de nivel înalt pentru desenarea imaginilor s ,i curbelor
Bezier s ,i pentru animarea cont ,inutului view-urilor. În plus fat ,˘a de furnizarea de clase pentru
implementarea suportului de desen, vizualiz ˘arile UIKit ofer ˘a o modalitate rapid ˘a s,i eficient ˘a
de a realiza imagini s ,i cont ,inut bazat pe text.
Framework-ul Core Graphics – (cunoscut ˘a s,i sub numele de Quartz) este motorul de desenare
nativ pentru aplicat ,iile iOS s ,i ofer ˘a suport pentru randarea personalizat ˘a a vectorilor 2D s ,i a
imaginilor. Des ,i nu este la fel de rapid ca redarea OpenGL ES, acest framework este foarte
potrivit pentru situat ,iile în care se dores ,te randarea dinamic ˘a de forme s ,i imagini personal-
izate 2D.
Core Animation – (parte a cadrului Quartz Core) este o tehnologie fundamental ˘a care opti-
mizeaz ˘a experient ,a de animat ,ie a aplicat ,iilor. View-urile UIKit utilizeaz ˘a Core Animation
pentru a oferi suportul animat ,iilor la nivel de vizualizare. Se poate utiliza Core Animation
direct atunci când se dores ,te mai mult control asupra comportamentului animat ,iilor.
Core Image – ofer ˘a suport avansat pentru manipularea video-urilor s ,i a imaginilor într-o
manier ˘a util ˘a.
OpenGL ES s ,i GLKit – se ocup ˘a de redarea avansat ˘a 2D s ,i 3D utilizând interfet ,e hardware-
accelerate. Acest framework este folosit în mod tradit ,ional de c ˘atre programatorii de jocuri
sau de oricine dores ,te s˘a implementeze o experient ,˘a grafic ˘a captivant ˘a. De asemenea, ofer ˘a
s,i un control deplin asupra procesului de redare s ,i cadrele pe secund ˘a necesare pentru a crea
animat ,ii f˘ar˘a probleme.
15
VEGHIU Sorin-Andrei
Metal – ofer ˘a acces extrem de redus la GPU-ul A7, permit ,ând performant ,e incredibil de
ridicate pentru performant ,ele grafice sofisticate de redare s ,i de calcul. Metal elimin ˘a multe
blocaje de performant ,˘a, precum validarea costisitoare a st ˘arii, care se g ˘asesc în API-urile
grafice tradit ,ionale.
TextKit s ,i Text Core – este o familie de clase UIKit utilizate pentru a efectua tipografie fin ˘a
s,i de gestionare a textului.
Image I/O – ofer ˘a interfet ,e pentru citirea s ,i scrierea majorit ˘at,ii formatelor de imagine.
Photos Library – Framework-urile Photos s ,i PhotosUI ofer ˘a acces la fotografiile, video-
clipurile s ,i materialele utilizatorului.
1.4.2.2 Tehnologii audio
Tehnologiile audio în iOS sunt urm ˘atoarele:
Framework-ul Media Player – la nivel înalt ofer ˘a un acces la biblioteca iTunes a utilizatorului
s,i suport pentru redarea melodiilor s ,i playlist-urilor.
A V Foundation – este o interfat ,˘a Obiectiv-C s ,i Swift pentru gestionarea înregistr ˘arii s ,i red˘arii
audio s ,i video.
OpenAL – este o tehnologie standard pentru furnizarea de sunet pozit ,ional.
Core Audio – este un set de framework-uri ce ofer ˘a atât interfet ,e simple, cât s ,i sofisticate,
pentru înregistrarea s ,i redarea cont ,inutului audio s ,i MIDI.
1.4.2.3 Tehnologii video
Tehnologiile video în iOS sunt urm ˘atoarele:
UIImagePickerController – este un view controller UIKit pentru alegerea fis ,ierelor media ale
utilizatorului.
A VKit – este un framework care ofer ˘a un set de interfet ,e us ,or de utilizat pentru prezentarea
videoclipurilor.
A V Foundation – ofer ˘a funct ,ii avansate de redare s ,i înregistrare video.
Core Media – este un framework care defines ,te tipurile de date de nivel sc ˘azut s ,i interfet ,ele
pentru media.
16
VEGHIU Sorin-Andrei
1.4.2.4 Framework-urile Media
Framework-ul Assets Library
Framework-ul Assets Library (AssetsLibrary.framework) ofer ˘a accesul la poze s ,i videoclipuri
salvate în aplicat ,ia Photos pe dispozitivul utilizatorului.
Framework-ul A V Foundation
Framework-ul A V Foundation (A VFoundation.framework) ofer ˘a un set de clase Objective-C s ,i
Swift pentru redarea, înregistrarea s ,i gestionarea cont ,inutului audio s ,i video. Serviciile oferite de
acest framework sunt:
Gestionarea sesiunii audio, inclusiv suport pentru declararea capabilit ˘at,ilor audio ale aplicat ,iei
în sistem
Gestionarea asset-urilor aplicat ,iei
Suport pentru editarea cont ,inutului media
Abilitatea de a înregistra audio s ,i video
Gestionarea metadatelor pentru articolele media
Panning stereofonic
Sincronizare precis ˘a între sunete
O interfat ,˘a Obiectiv-C s ,i Swift pentru determinarea detaliilor despre fis ,ierele audio, cum ar
fi formatul datelor, rata de sample s ,i num ˘arul de canale
Framework-ul Game Controller
Framework-ul Game Controller (GameController.framework) permite descoperirea s ,i configu-
rarea hardware-ului game controller-ului creat pentru dispozitivele iOS. Game controller-ele pot fi
dispozitive conectate fizic la un dispozitiv iOS sau wireless prin Bluetooth.
Framework-ul SceneKit
SceneKit este un framework Objective-C s ,i Swift pentru realizarea de jocuri simple s ,i interfet ,e
îmbun ˘at˘at,ite pentru utilizatori s ,i elemente de grafic ˘a 3D s ,i 2D, combinând un motor de randare
performant cu un API descriptiv de nivel înalt. API-urile de nivel inferior (cum ar fi OpenGL ES)
necesit ˘a implementarea algoritmilor de redare care afis ,eaz˘a o scen ˘a cu detalii precise. Spre deose-
bire de aceasta, SceneKit permite descrierea scenei în ceea ce prives ,te cont ,inutul s ˘au (geometria,
materialele, luminile s ,i camerele) s ,i animarea, descriind modific ˘arile aduse acestor obiecte.
Motorul fizic 3D al lui SceneKit d ˘a viat ,˘a aplicat ,iei sau jocului prin simularea gravitat ,iei, a
fort ,elor, a coliziunilor rigide ale corpurilor s ,i a articulat ,iilor.
17
VEGHIU Sorin-Andrei
Framework-ul SpriteKit
Framework-ul SpriteKit (SpriteKit.framework) ofer ˘a un sistem de animat ,ie accelerat ˘a hardware
pentru jocuri 2D s ,i 2.5D. SpriteKit ofer ˘a infrastructura pe care majoritatea jocurilor le necesit ˘a,
inclusiv un sistem de redare s ,i animat ,ie grafic ˘a, suport pentru redarea sunetului s ,i un motor de
simulare a fizicii.
Cont ,inutul dintr-o aplicat ,ie SpriteKit este organizat în scene. O scen ˘a poate include obiecte
texturate, imagini video, forme bazate pe trasee, filtre Core Image s ,i alte efecte speciale. SpriteKit
ia aceste obiecte s ,i determin ˘a modul cel mai eficient de a le afis ,a pe ecran. Când trebuie s ˘a animat ,i
cont ,inutul din scene, se poate utiliza SpriteKit pentru a specifica act ,iunile explicite pe care dorit ,i s˘a
le efectuat ,i sau pentru a folosi motorul de simulare a fizicii pentru a defini comportamentele fizice
(cum ar fi gravitatea, atract ,ia sau repulsia) pentru obiecte.
1.4.3 Stratul Core Services
Stratul Core Services cont ,ine servicii fundamentale ale sistemului pentru aplicat ,ii s,i suport pen-
tru tehnologiile individuale pentru a oferi funct ,ii precum locat ,ia, iCloud, ret ,ele sociale s ,i ceea ce
necesit ˘a conectarea la internet.
1.4.3.1 Caracteristici de nivel înalt
Servicii peer-to-peer
Framework-ul Multipeer Connectivity ofer ˘a conectare peer-to-peer prin Bluetooth. Se poate
folosi conectarea peer-to-peer pentru a init ,ia sesiuni de comunicare cu dispozitivele din apropiere.
Des ,i, conectivitatea peer-to-peer este adesea folosit ˘a în cadrul jocurilor, se poate utiliza acest ˘a
funct ,ie s,i în cadrul altor tipuri de aplicat ,ii.
Stocarea iCloud
Stocarea iCloud permite aplicat ,iei s˘a scrie documente s ,i datele utilizatorului într-o locat ,ie cen-
tral˘a. Utilizatorii pot s ˘a acceseze apoi elementele de pe toate calculatoarele s ,i dispozitivele iOS.
Prin accesul omniprezent la documentele unui utilizator utilizând iCloud semnific ˘a faptul c ˘a utiliza-
torii pot vizualiza sau edita aceste documente de pe orice dispozitiv f ˘ar˘a a fi nevoie s ˘a sincronizeze
sau s ˘a transfere fis ,ierele în mod explicit. Stocarea documentelor în contul iCloud al unui utilizator
ofer˘a, de asemenea, un nivel de sigurant ,˘a utilizatorilor. Chiar dac ˘a un utilizator pierde un dispozi-
tiv, documentele de pe acest dispozitiv nu se pierd dac ˘a sunt stocate în iCloud.
Aplicat ,iile pot beneficia de spat ,iul de stocare iCloud în urm ˘atoarele modalit ˘at,i:
Stocarea documentelor în iCloud – pentru a stoca documente s ,i date utilizator în contul iCloud
al utilizatorului.
Stocarea datelor cu cheie-valoare în iCloud – pentru a partaja cantit ˘at,i mici de date între
instant ,ele aplicat ,iei.
18
VEGHIU Sorin-Andrei
Stocare CloudKit – pentru a crea cont ,inut public partajat sau pentru a gestiona transferul de
date personal.
Obiectele Block
Obiectele block sunt o construct ,ie de limbaj C s ,i poate fi ad ˘augat în codul C s ,i Objective-C. Un
obiect bloc este în esent ,˘a o funct ,ie anonim ˘a s,i datele care se refer ˘a la acea funct ,ie, lucru care în alte
limbaje este numit uneori închidere sau lambda. Blocurile sunt utile în special pentru callback-uri
sau în locuri unde avet ,i nevoie de o modalitate de a combina us ,or, atât codul care trebuie executat,
cât s ,i datele asociate. În iOS, blocurile sunt frecvent utilizate în urm ˘atoarele scenarii:
Ca înlocuitor pentru delegat ,i s,i metode delegate
Ca înlocuitor pentru funct ,iile de callback
Pentru a implementa operatorii de completare pentru operat ,iuni unice
Pentru a facilita efectuarea unei sarcini pe toate elementele dintr-o colect ,ie
Pentru a fi folosite împreun ˘a cu cozile dispatch, pentru a efectua sarcini asincrone
Data Protection
Protect ,ia datelor permite aplicat ,iilor care funct ,ioneaz ˘a cu date de utilizator sensibile s ˘a prof-
ite de criptarea încorporat ˘a, disponibil ˘a pe unele dispozitive. Când aplicat ,ia desemneaz ˘a un anumit
fis,ier drept protejat, sistemul stocheaz ˘a acel fis ,ier pe disc într-un format criptat. În timp ce dis-
pozitivul este blocat, cont ,inutul fis ,ierului este inaccesibil atât aplicat ,iei, cât s ,i potent ,ialilor intrus ,i.
Cu toate acestea, atunci când dispozitivul este deblocat de c ˘atre utilizator, este creat ˘a o cheie de
decriptare pentru a permite aplicat ,iei s˘a acceseze fis ,ierul.
Suport pentru distribuirea fis ,ierelor
Suportul de distribuire a fis ,ierelor permite aplicat ,iilor s ˘a fac ˘a fis ,iere de date de utilizator disponi-
bile în iTunes 9.1 s ,i versiunile ulterioare. O aplicat ,ie care declar ˘a suportul pentru partajarea
fis,ierelor face ca directorul s ˘au /Documents s ˘a fie disponibil pentru utilizator. Utilizatorul poate
muta fis ,iere în s ,i din acest director, dup ˘a cum este necesar din iTunes.
Grand Central Dispatch
Grand Central Dispatch (GCD) este o tehnologie de nivel BSD care poate fi utilizat ˘a pentru
a gestiona executarea sarcinilor într-o aplicat ,ie. GCD combin ˘a un model de programare asincron
cu un nucleu foarte optimizat pentru a oferi o alternativ ˘a convenabil ˘a (s ,i mai eficient ˘a) pentru
filtrare. GCD furnizeaz ˘a, de asemenea, alternative convenabile pentru multe tipuri de sarcini de
nivel sc ˘azut, cum ar fi citirea s ,i scrierea descriptorilor de fis ,iere, implementarea cronometrelor s ,i
monitorizarea semnalelor s ,i evenimentelor de proces.
19
VEGHIU Sorin-Andrei
In-App Purchase
In-App Purchase ofer ˘a posibilitatea de a vinde cont ,inut s ,i servicii specifice aplicat ,iilor s ,i cont ,inutul
iTunes din interiorul aplicat ,iei. Aceast ˘a caracteristic ˘a este implementat ˘a utilizând cadrul StoreKit,
care ofer ˘a infrastructura necesar ˘a proces ˘arii tranzact ,iilor financiare utilizând contul iTunes al uti-
lizatorului.
SQLite
Biblioteca SQLite v ˘a permite s ˘a încorporat ,i o baz ˘a de date SQL us ,oar˘a într-o aplicat ,ie f˘ar˘a a
rula un proces separat de server de baze de date la distant ,˘a. Din aplicat ,ie, se pot crea fis ,iere de
baze de date locale s ,i pot fi gestionate tabelele s ,i înregistr ˘arile din aceste fis ,iere. Biblioteca este
conceput ˘a pentru utilizare general ˘a, dar este, de asemenea, optimizat ˘a pentru a oferi acces rapid la
înregistr ˘arile bazei de date.
Suport XML
Framework-ul Foundation ofer ˘a clasa NSXMLParser pentru extragerea elementelor dintr-un
document XML. Suportul suplimentar pentru gestionarea cont ,inutului XML este oferit de libxml2.
Aceast ˘a bibliotec ˘a open source permite s ˘a se parseze sau s ˘a se scrie rapid date XML arbitrare s ,i s˘a
transforme cont ,inutul XML în HTML.
1.4.3.2 Framework-urile Core Services
Framework-ul Accounts
Framework-ul Accounts (Accounts.framework) ofer ˘a un model de single sign-on pentru anumite
conturi de utilizatori. Single sign-on îmbun ˘at˘at,es,te experient ,a utilizatorului eliminând necesitatea
de a-i solicita separat credent ,ialele pentru logarea pe mai multe conturi.
Framework-ul CFNewtork
Framework-ul CFNetwork (CFNetwork.framework) este un set de interfet ,e C de înalt ˘a performant ,˘a
ce utilizeaz ˘a abstract ,ii orientate pe obiecte pentru a lucra cu protocoalele de ret ,ea. Aceste abstract ,ii
ofer˘a un control detaliat asupra stivei de protocoale s ,i faciliteaz ˘a utilizarea unor construct ,ii de nivel
inferior, cum ar fi soclurile BSD. Se poate utiliza acest framework pentru a simplifica sarcini pre-
cum comunicarea cu serverele FTP s ,i HTTP sau rezolvarea gazdelor DNS. Cu cadrul CFNetwork,
se pot îndeplini urm ˘atoarele act ,iuni:
Se pot utiliza soclurile BSD.
Se pot crea conexiuni criptate, utilizând SSL sau TLS.
Se poate îndeplini lucrul cu host-urile DNS.
20
VEGHIU Sorin-Andrei
Se poate îndeplini lucrul cu servere HTTP, autentificarea serverelor HTTP s ,i a serverelor
HTTPS.
Se poate îndeplini lucrul cu servere FTP.
Se pot folosi serviciile Bonjour.
Framework-ul Core Motion
Framework-ul Core Motion (CoreMotion.framework) ofer ˘a un singur set de interfet ,e pentru
accesarea tuturor datelor bazate pe mis ,care disponibile pe un dispozitiv iOS. Framework-ul accept ˘a
accesarea datelor prelucrate s ,i brute ale accelerometrului utilizând un nou set de interfet ,e bazate pe
blocuri. Pentru dispozitivele cu giroscop integrat, se pot prelua datele giroscoapelor brute precum
s,i datele prelucrate care reflect ˘a rata de atitudine s ,i de rotat ,ie a dispozitivului. Se pot folosi ambele
tipuri de date bazate pe accelerometru s ,i pe giroscop pentru jocuri sau alte aplicat ,ii care folosesc
mis ,carea ca date de intrare sau ca modalitate de a spori experient ,a general ˘a a utilizatorului.
Framework-ul StoreKit
Framework-ul StoreKit (StoreKit.framework) ofer ˘a suport pentru achizit ,ionarea de cont ,inut s ,i
servicii din aplicat ,iile iOS, o funct ,ie cunoscut ˘a sub denumirea de achizit ,ie în aplicat ,ie. De ex-
emplu, se poate utiliza aceast ˘a funct ,ie pentru a permite utilizatorului s ˘a deblocheze funct ,ii supli-
mentare ale aplicat ,iei sau în cazul unui joc se poate folosi pentru a oferi nivele suplimentare sau
elemente noi în cadrul jocului. În ambele cazuri, cadrul StoreKit gestioneaz ˘a aspectele financiare
ale tranzact ,iei, proceseaz ˘a cererile de plat ˘a prin contul iTunes Store al utilizatorului s ,i furnizeaz ˘a
aplicat ,iei informat ,ii despre achizit ,ie.
1.4.4 Stratul Core OS
Stratul Core OS cont ,ine caracteristicile de nivel sc ˘azut pe baza c ˘arora majoritatea celorlalte
tehnologii sunt construite.
Framework-ul Accelerate
Framework-ul Accelerate (Accelerate.framework) cont ,ine interfet ,e pentru realizarea proces ˘arii
digitale a semnalelor (DSP), a algebrei liniare s ,i a calculelor de procesare a imaginilor. Avan-
tajul utiliz ˘arii acestui framework în scrierea propriilor versiuni ale acestor interfet ,e este c ˘a sunt
optimizate pentru toate configurat ,iile hardware prezente pe dispozitivele iOS.
Framework-ul Core Bluetooth Framework-ul Core Bluetooth (CoreBluetooth.framework)
permite programatorilor s ˘a interact ,ioneze în mod special cu accesoriile Bluetooth cu consum redus
de energie (LE). Interfet ,ele Swift s ,i Objective-C ale acestui framework permit realizarea urm ˘a-
toarelor act ,iuni:
Permite scanarea pentru accesorii Bluetooth, conectarea s ,i deconectarea de la acestea
21
VEGHIU Sorin-Andrei
Permite furnizarea serviciilor dintr-o aplicat ,ie, transformând dispozitivul iOS într-un dispoz-
itiv periferic pentru alte dispozitive Bluetooth
Permite transmiterea informat ,iilor iBeacon de pe dispozitivul iOS
Permite p ˘astrarea conexiunilor Bluetooth s ,i restaurarea acestora atunci când aplicat ,ia este
ulterior lansat ˘a în execut ,ie
Framework-ul Local Authentication
Framework-ul Local Authentication (LocalAuthentication.framework) permite utilizarea Touch
ID-ului pentru autentificarea utilizatorului. Unele aplicat ,ii ar putea necesita s ˘a asigure accesul la
întregul cont ,inut, în timp ce altele ar putea necesita securizarea anumitor informat ,ii sau opt ,iuni.
Framework-ul Security
În plus fat ,˘a de funct ,iile încorporate, iOS ofer ˘a un framework explicit de securitate (Security.framework).
Acest framework ofer ˘a interfet ,e pentru gestionarea certificatelor, chei publice s ,i private s ,i politici
de încredere.
Biblioteca comun ˘a Crypto ofer ˘a suport suplimentar pentru codificarea simetric ˘a, codurile de au-
tentificare a mesajelor bazate pe hash (HMAC) s ,i digest- ˘ari. Caracteristica pentru digest- ˘ari ofer ˘a
funct ,ii care sunt, în esent ,˘a, compatibile cu cele din biblioteca OpenSSL, care nu este disponibil ˘a în
iOS.
System
Nivelul sistemului include mediul kernel-ului, driverele s ,i interfet ,ele UNIX de nivel sc ˘azut ale
sistemului de operare. Kernelul însus ,i, bazat pe Mach, este responsabil pentru fiecare aspect al
sistemului de operare. Administreaz ˘a sistemul de memorie virtual ˘a, firele de execut ,ie, sistemul de
fis,iere, ret ,eaua s ,i comunicarea interproces.
22
VEGHIU Sorin-Andrei
2 Limbajul de programare Swift
2.1 Descriere general ˘a
Swift este un limbaj de programare cu scop general, multi-paradigm, compilat s ,i dezvoltat de
Apple Inc. pentru sistemele de operare iOS, macOS, watchOS, tvOS s ,i Linux. Swift a fost proiec-
tat pentru a lucra cu framework-urile Apple, Cocoa s ,i Cocoa Touch, s ,i cu codul Objective-C care
este scris în produsele Apple. Acest limbaj de programare este construit cu framework-ul compi-
latorului open-source LLVM (Low Level Virtual Machine) s ,i a fost inclus începând cu versiunea
6 a Xcode. Pe alte platforme, în afara de Linux, foloses ,te biblioteca Objective-C de runetime ce
permite codului C, C++, Objective-C s ,i Swift s ˘a ruleze într-un singur program.
Swift este destinat s ˘a fie mai concis s ,i "mai sigur" la codul eronat decât Objective-C. Pentru
sigurant ,˘a, Swift ajut ˘a la rezolvarea erorilor de programare comune cum ar fi null pointers s ,i ofer ˘a o
sintax ˘a us ,oar˘a de folosit s ,i de înteles pentru a evita rezultarea unui pyramid of doom (apare atunci
când un program foloses ,te mai multe nivele de indentare imbricate pentru a controla accesul la
o funct ,ie). Mai exact, Swift adaug ˘a conceptul extensibilit ˘at,ii protocolului, un sistem de extensi-
bilitate care poate fi aplicat tipurilor, structurilor s ,i claselor. Apple promoveaz ˘a acest lucru ca o
schimbare real ˘a în paradigmele de programare pe care o numes ,te "programare orientat ˘a pe proto-
col".
Swift a fost prezentat la conferint ,a Apple mondial ˘a a programatorilor din 2014 (WWDC).
Acesta a primit o actualizare la versiunea 1.2 în decursul anului 2014 s ,i o actualizare mai mare
la Swift 2.0 la WWDC 2015. Versiunea 2.2 a devenit software open source sub licent ,a Apache 2.0
pe data de 3 decembrie 2015, pentru platformele Apple s ,i Linux.
În martie 2017, la mai put ,in de trei ani de la debutul s ˘au oficial, Swift a ajuns în top 10 în
clasamentul TIOBE al celor mai populare limbaje de programare.
2.1.1 Caracteristici
Swift este o alternativ ˘a a limbajul Obiective-C care utilizeaz ˘a conceptele teoriei limbajului de
programare modern s ,i încearc ˘a s˘a prezinte o sintax ˘a mai simpl ˘a. În timpul introducerii sale, limba-
jul a fost descris, pur s ,i simplu, ca "Obiective-C f ˘ar˘a C".
Implicit, Swift nu foloses ,te pointeri s ,i alt ,i accesori nesiguri, în comparat ,ie cu Objective-C,
care foloses ,te pointeri pentru a se referi la instant ,ele obiectelor. De asemenea, sintaxa folosit ˘a de
Objective-C pentru apelarea metodelor a fost înlocuit ˘a cu o notat ,ie de tip punct s ,i cu un namespace
mai familiar pentru programatorii de limbaje obiect-orientate precum Java sau C#. Swift p ˘astreaz ˘a
conceptele cheie ale Objective-C, inclusiv protocoalele, închiderile s ,i categoriile, înlocuind sintaxa
anterioar ˘a cu versiuni mai exacte, permit ,ând ca aceste concepte s ˘a fie aplicate altor structuri ale
limbajului, precum tipul enumerat ,ie (enum).
23
VEGHIU Sorin-Andrei
2.1.2 Syntactic sugar
Multe dintre clasele des utilizate în Objective-C sunt parte din biblioteca Foundation Kit. Acest
fapt a permis includerea bibliotecii NSString (folosind Unicode), colect ,iile NSArray s ,i NSDic-
tionary, precum s ,i altele. Objective-C a oferit numeroase p ˘art,i de syntactic sugar pentru a permite
ca unele din obiecte s ˘a fie us ,or create în cadrul limbajului, îns ˘a odat ˘a create, obiectele pot fi con-
trolate prin apeluri de obiecte. Spre exemplu, în Objective-C pentru a concatena dou ˘a obiecte
NSString necesit ˘a apeluri de metode (Fig. 2).
Fig. 2: Concatenare de string-uri în Objective-C
În Swift, multe dintre aceste tipuri de baz ˘a au fost dezvoltate de la baza limbajului s ,i pot fi
utilizate direct. Spre exemplu, s ,irurile de caractere (string-urile) sunt legate de clasa NSString
(când este importat ˘a biblioteca Foundation) s ,i pot fi concatenate folosind operatorul "+" , permit ,ând
o sintax ˘a mult mai simplificat ˘a (Fig. 3).
Fig. 3: Concatenare de string-uri în Swift
2.1.3 Nivele de acces
Swift pune la dispozit ,ie cinci nivele pentru controlul accesului la entit ˘at,ile din cadrul codului:
open, public, internal, fileprivate s ,i private. Spre deosebire de alte limbaje orientate pe obiecte,
aceste controale de acces ignor ˘a ierarhiile de mos ,tenire, dupa cum urmeaz ˘a:
private – indic ˘a faptul c ˘a o entitate este accesibil ˘a doar în domeniul imediat dup ˘a aplicare
fileprivate – indic ˘a faptul c ˘a o entitate este accesibil ˘a doar din interiorul fis ,ierului
internal – indic ˘a faptul ca o entitate este accesibil ˘a în modulul care îl cont ,ine
public – indic ˘a faptul ca o entitate este accesibil ˘a din orice modul
open – (folosit pentru clase s ,i metodele acestora) indic ˘a faptul c ˘a respectiva clas ˘a poate fi
subclasat ˘a în afara modulului
2.1.4 Tipul Optional, înl ˘ant ,uiri s ,i structurile "if let" s ,i "guard"
O nou ˘a caracteristic ˘a important ˘a în Swift este tipul optional care permite ca referint ,ele sau val-
orile s ˘a funct ,ioneze într-o manier ˘a similar ˘a modelului comun în C, unde un pointer se poate referi
24
VEGHIU Sorin-Andrei
la o valoare sau poate fi null. Astfel, implic ˘a faptul c ˘a tipurile non-opt ,ionale nu pot avea ca rezultat
o eroare null-pointer.
Tipurile opt ,ionale sunt create cu mecanismul Optional. As ,adar, pentru a crea un Integer care
este nullabil, s-ar utiliza o declarat ,ie similar ˘a cu var optionalInteger: Optional<Int> . Ca s ,i C#,
Swift include, de asemenea, syntactic sugar pentru acest lucru, permit ,ându-i s ˘a indice o variabil ˘a
este opt ,ional ˘a prin plasarea unui semn de var optionalInteger: Int? dup ˘a numele de tip. Variabilele
sau constantele care sunt marcate opt ,ional fie au o valoare a tipului de baz ˘a, fie sunt nil. Tipurile
opt,ionale împacheteaz ˘a tipul de baz ˘a, conducând la o alt ˘a situat ,ie. String s ,i String? sunt tipuri
diferite, cel din urm ˘a are mai mult în comun cu Int? decât cu String. Pentru a accesa valoarea din
interior, presupunând c ˘a nu este nil, aceasta trebuie s ˘a fie despachetat ˘a pentru a se vedea valoarea
din interior. Despachetarea fort ,at˘a se realizeaz ˘a utlizând operatorul "!". Spre exemplu:
Fig. 4: Tipul String opt ,ional în Swift
Dup˘a cum se poate observa în Fig. 4 se încearc ˘a afis ,area string-ului, în cazul în care acesta nu
este nil. Când rul ˘am acest cod rezultatul va fi: Optional("Hello, Swift!"), deoarece respectivul s ,ir
de caractere este "împachetat" prin tipul Optional. Operatorul "?" ajut ˘a la evitarea unui pyramid of
doom în cazul în care o variabil ˘a cont ,ine nil. Pentru despachetarea fort ,at˘a se foloses ,te operatorul
"!", în felul urm ˘ator:
Fig. 5: Tipul String opt ,ional despachetat prin operatorul "!"
Un alt tip de despachetare, este despachetarea automat ˘a. Variabilele opt ,ionale pot fi declarate
utilizând operatorul "!" în locul operatorului "?". Astfel, variabilele opt ,ionale se vor despacheta
automat s ,i nu va fi nevoie ad ˘augarea ulterioar ˘a de alt ,i operatori precum "!". Un exemplu de utilizare
a despachet ˘arii automate se poate observa în Fig. 6.
25
VEGHIU Sorin-Andrei
Fig. 6: Despachetarea automat ˘a în Swift
Totodat ˘a, în cadrul test ˘arii tipurilor opt ,ionale se poate folosi optional binding. Prin optional
binding se verific ˘a dac ˘a o variabil ˘a opt ,ional ˘a cont ,ine o valoare s ,i, în cazul în care cont ,ine, se
stocheaz ˘a valoarea respectiv ˘a într-o constant ˘a sau o variabil ˘a temporar ˘a. În Fig. 7 se poate observa
modul în care se realizeaz ˘a optional binding, utilizând structura decizional ˘a "if":
Fig. 7: Optional binding în Swift
Rezultatul codului compilat, de mai sus, este: "Your string has – Hello, Swift!".
Originea termenului de "înl ˘ant,uire" (chaining) în cadrul tipurilor opt ,ionale provine din cazul în
care mai multe apeluri de metode sau getter-i sunt înl ˘ant,uit,i. Spre exemplu:
Fig. 8: Tipul Optional neînl ˘ant,uit
Variabilele temporare definite în Fig. 8 pot fi scrise ca fiind înl ˘ant,uite, în felul urm ˘ator:
Fig. 9: Optional chaining
În Swift 2 s-a introdus cuvântul rezervat "guard" pentru cazurile în care trebuie s ˘a se opreasc ˘a
execut ,ia codului dac ˘a nu este îndeplinit ˘a o anumit ˘a condit ,ie.
26
VEGHIU Sorin-Andrei
Fig. 10: Structura guard
Structura "guard" ajut ˘a la evitarea complexit ˘at,ii numeroaselor condit ,ii imbricate "if let", precum
în exemplul urm ˘ator:
Fig. 11: Structuri "if let" imbricate
Des ,i, structurile decizionale "if let" din exemplul de mai sus pot fi scrise ca fiind instructiuni
independente, valorile despachetate vor fi vizibile doar în interiorul structurilor. Spre deosebire
de acestea, structurile "guard", odat ˘a ce condit ,iile au fost îndeplinite, permit p ˘astrarea valorilor
despachetate în afara instruct ,iunii.
2.1.5 Tipul valoare
În multe limbaje de programare orientate pe obiecte, obiectele sunt reprezentate în doua p ˘art,i.
Într-una dintre p ˘art,i obiectul este stocat sub forma unui bloc de date aflat pe heap, iar în cealalt ˘a
parte numele acelui obiect este reprezentat de un pointer. Obiectele sunt transmise între metode
prin copierea valorii pointer-ului, permit ,ând aceloras ,i date de pe heap s ˘a fie accesate de oricine
det,ine o copie. În contrast, tipurile de baz ˘a precum valorile integer sau float sunt reprezentate di-
rect. Mai exact, numele obiectului cont ,ine datele, nu un pointer la acesta, s ,i datele sunt transmise
direct prin intermediul metodelor prin copiere. Aceste tipuri de acces sunt denumite transmitere
prin referint ,˘a (în cazul obiectelor) s ,i transmitere prin valoare (în cazul tipurilor de baz ˘a).
Similar cu C# s ,i spre deosebire de celelalte limbaje obiect orientate, Swift ofer ˘a suport încorpo-
rat pentru obiectele ce folosesc fie transmiterea prin referint ,˘a (class), fie transmiterea prin valoare
(struct). În Swift structurile au aproape aceleas ,i caracteristici precum clasele: pot avea metode, pot
implementa protocoale s ,i utiliza mecanisme de extindere. Îns ˘a, în Swift, structurile nu pot utiliza
mos ,tenirea.
27
VEGHIU Sorin-Andrei
Pentru a se asigura c ˘a structurile de dimensiuni mari nu produc impedimente de performant ,˘a
atunci când sunt folosite, Swift utilizeaz ˘a "copy on write" s ,i astfel obiectele sunt copiate doar dac ˘a
programul încearc ˘a s˘a le modifice o valoare. As ,adar, diferit ,i accesori au un efect similar cu un
pointer ce indic ˘a acelas ,i loc unde sunt stocate datele. Acest lucru are loc sub nivelul limbajului, în
unitatea de gestionare a memoriei calculatorului (MMU). Deci, în timp ce datele sunt stocate fizic
ca o instant ,˘a în memorie, la nivelul aplicat ,iei, aceste valori sunt separate, iar separarea fizic ˘a este
impus ˘a prin "copy on write" doar dac ˘a este necesar ˘a.
2.1.6 Programare orientat ˘a pe protocol
O caracteristic ˘a cheie a Objective-C este suportul pentru categorii, metode ce pot fi ad ˘augate
pentru a extinde clasele la runetime. Categoriile permit extinderea claselor în locul ad ˘aug˘arii de
funct ,ii noi, f ˘ar˘a a fi nevoie de subclase sau de a avea acces la codul surs ˘a de baz ˘a. Un exemplu
ar putea fi ad ˘augarea suportului verific ˘arii ortografiei la clasa de baz ˘a NSString, ceea ce înseamn ˘a
c˘a toate instant ,ele NSString vor permite verificarea ortografic ˘a a aplicat ,iei. De asemenea, sistemul
este utilizat pe scar ˘a larga ca o tehnic ˘a organizat ,ional ˘a, permit ,ând colectarea de coduri similar în
extensii de tip bibliotec ˘a.
Swift continu ˘a s˘a sust ,in˘a acest concept, des ,i recent sunt adesea numite extensii s ,i sunt declarate
prin cuvântul rezervat "extension". Spre deosebire de Objective-C, Swift poate ad ˘auga propriet ˘at,i,
tipuri s ,i chiar enum-uri pentru a extinde instant ,ele claselor.
O alt ˘a caracteristic ˘a cheie a Objective-C este utilizarea protocoalelor, cunoscute în majoritatea
limbajelor de programare s ,i sub numele de interfet ,e. Protocoalele promit faptul c ˘a o anumit ˘a clas ˘a
implementeaz ˘a un set de metode, însemnând c ˘a orice alt obiect din sistem poate apela respectivele
metode pentru orice obiect care implementeaz ˘a acel protocol. Acest lucru este adesea utilizat în
limbajele moderne orientate pe obiecte ca înlocuitor al mos ,tenirii multiple, des ,i seturile de carac-
teristici nu sunt în întregime similare.
În majoritatea limbajelor de programare ce implementeaz ˘a conceptul de protocol, este de da-
toria programatorului s ˘a asigure faptul c ˘a metodele necesare sunt implementate în fiecare clas ˘a.
Swift adaug ˘a capacitatea de a ad ˘auga aceste metode utilizând extensii s ,i de a utiliza programarea
generic ˘a (generics) pentru a le implementa. Împreun ˘a, acestea permit ca protocoalele s ˘a fie scrise
o singur ˘a dat ˘a s,i suport ˘a o varietate de instant ,e. De asemenea, mecanismul de extensie poate fi
folosit pntru a ad ˘auga conformitatea protocolului cu un obiect care nu cont ,ine lista respectivelor
protocoale în definit ,ia sa.
Spre exemplu, poate fi declarat un protocol numit "SupportsToString", care asigur ˘a c˘a instant ,ele
care sunt conforme cu protocolul implementeaz ˘a o metod ˘a "toString()" care returneaz ˘a un "String".
În Swift protocolul respectiv poate fi declarat în felul urmator:
28
VEGHIU Sorin-Andrei
Fig. 12: Protocolul SupportsToString
Acest protocol poate fi ad ˘augat pentru a extinde clasa String, f ˘ar˘a a avea acces la codul surs ˘a al
clasei:
Fig. 13: Extinderea clasei String cu protocolul SupportsToString
În Swift, precum s ,i în multe alte limbaje ce ofer ˘a suport pentru interfet ,e, protocoalele pot fi
folosite ca s ,i tipuri, ceea ce înseamn ˘a c˘a variabilele s ,i metodele pot fi definite ca fiind un protocol
în locul unui tip specific:
Fig. 14: Protocolul folosit ca s ,i tip
De asemenea, nu conteaz ˘a ce fel de instant ,˘a este "someSortOfPrintableObject", deoarece com-
pilatorul se va asigura de faptul c ˘a acesta este în conformitate cu protocolul s ,i astfel codul este
sigur. Aceast ˘a sintax ˘a, de asemenea, înseamn ˘a c˘a s,i colect ,iile se pot baza pe protocoale, spre ex-
emplu: "let printableArray = [SupportsToString]".
Totodat ˘a, deoarece Swift trateaz ˘a structurile si clasele ca fiind concepte similare, protocoalele
s,i extensiile sunt utilizate în Swift la runetime pentru a oferi API-uri (Application Programming
Interface) îmbun ˘at˘at,ite s ,i bazate pe structuri.
2.1.7 Biblioteci, runetime s ,i dezvoltare
Swift utilizeaz ˘a acelas ,i runetime ca s ,i sistemul Objective-C existent, îns ˘a necesit ˘a iOS 7, macOS
10.9 sau o versiune ulterioar ˘a. Codul Swift s ,i Objective-C poate fi utilizat într-un singur program
29
VEGHIU Sorin-Andrei
s,i, prin extensie, se poate utiliza al ˘aturi de cod C s ,i C++. În contrast cu C, codul C++ nu poate fi
folosit pur si simplu în Swift. Trebuie s ˘a existe un wrapper C sau Objective-C între Swift s ,i C++.
În cazul Objective-C, Swift are acces considerabil la modelul de obiect s ,i poate fi utilizat pentru a
subclasa, a extinde sau a folosi cod Objective-C pentru a oferi suport pentru protocoale. Invers nu
este posibil, deoarce o clas ˘a Swift nu poate fi subclas ˘a în Objective-C.
Pentru a veni în ajutorul programelor de acest tip s ,i pentru reutilizarea codului existent, Xcode
6 ofer ˘a un sistem semi-automat care construies ,te s ,i ment ,ine un header de leg ˘atur˘a pentru a expune
codul Objective-C pentru Swift. Acesta este reprezentat sub forma unui fis ,ier header suplimentar,
care defines ,te sau import ˘a toate simbolurile Objective-C necesare pentru codul Swift al proiectului.
Din acel moment, Swift se poate referi la respectivele tipuri, funct ,ii sau variabile Objective-C ca
s,i cum ar fi fost scrise nativ în Swift. De asemenea, codul Objective-C poate folosi cod Swift di-
rect, importând un fis ,ier header automat ce cont ,ine declarat ,iile Objective-C ale simbolurilor Swift
ale proiectului. Spre exemplu, un fis ,ier Objective-C dintr-un proiect mixt denumit "MyApplica-
tion" poate accesa clase Swift sau funct ,ii utilizând #import "MyApplication-Swift.h". Nu toate
simbolurile sunt disponibile utilizând acest mecanism, precum unele caracteristici specifice Swift
precum tipuri generice, tipuri opt ,ionale, enum-uri sofisticate sau chiar indentificatori Unicode ale
c˘aror simboluri nu sunt accesibile din Objective-C.
De asemenea, Swift are sunt suport limitat pentru atribute s ,i metadate care sunt citite de mediul
de dezvoltare s ,i nu sunt neap ˘arat parte din codul compilat.
2.1.8 Gestionarea memoriei prin ARC
Swift foloses ,te Automatic Reference Counting (ARC) pentru a urm ˘ari s ,i a gestiona utilizarea
memoriei aplicat ,iei. În cele mai multe dintre cazuri, acest lucru înseamn ˘a c˘a gestionarea memoriei
"funct ,ioneaz ˘a" pur s ,i simplu în Swift, iar programatorul nu trebuie s ˘a-s,i fac ˘a griji pentru ges-
tionarea memoriei. ARC elibereaz ˘a automat memoria utilizat ˘a de instant ,ele claselor atunci când
acele instant ,e nu mai sunt necesare.
Modul de funct ,ionare al ARC
De fiecare dat ˘a când se creeaz ˘a o nou ˘a instant ,˘a a unei clase, ARC aloc ˘a o bucat ˘a de memorie
pentru a stoca informat ,ii despre acea instant ,˘a. Aceast ˘a memorie cont ,ine informat ,ii despre tipul
instant ,ei, împreun ˘a cu valoriile tuturor propriet ˘at,ilor stocate s ,i asociate respectivei instant ,e.
În plus, atunci când o instant ,˘a nu mai este necesar ˘a, ARC elibereaz ˘a memoria utilizat ˘a de acea
instant ,˘a, astfel încat memoria eliberat ˘a va putea fi folosit ˘a în alte scopuri. Aceast ˘a funct ,ionalitate
asigur ˘a faptul c ˘a instant ,ele claselor nu ocup ˘a spat ,iul din memorie inutil atunci când nu mai sunt
utilizate.
Cu toate acestea, în cazul în care ARC dealoc ˘a o instant ,˘a care este înc ˘a în uz, atunci nu se vor
mai putea accesa propriet ˘at,ile sau apela metodele instat ,ei. De asemenea, dac ˘a în acest caz s-ar
încerca accesarea instant ,ei, atunci aplicat ,ia se va opri.
30
VEGHIU Sorin-Andrei
De fiecare dat ˘a când se atribuie o instant ,˘a de clas ˘a unei propriet ˘at,i, unei constante sau unei
variabile, acea proprietate, constant ˘a sau variabil ˘a are o referint ,˘a puternic ˘a c˘atre acea instant ,˘a.
Referint ,a respectiv ˘a se numeste referint ,˘a "puternic ˘a", deoarece ment ,ine o pozit ,ie sigur ˘a asupra
acelei instant ,e s,i nu permite ca aceasta s ˘a fie dealocat ˘a atâta timp cât referint ,a puternic ˘a exist ˘a.
În exemplul urm ˘ator se va putea observa cum funct ,ioneaz ˘a Automatic Reference Counting:
Fig. 15: Clasa Person ce cont ,ine proprietatea "name"
Clasa Person are un constructor cu un singur parametru, s ,i anume, name ,care stabiles ,te pro-
prietatea name a clasei, s ,i care afis ,eaz˘a un mesaj care indic ˘a faptul c ˘a init ,ializarea este în curs de
desf˘as,urare. De asemenea, clasa Person, cont ,ine s ,i un destructor care afis ,eaz˘a un mesaj atunci când
o instant ,˘a a clasei este dealocat ˘a.
Urm ˘atorul fragment de cod defines ,te trei variabile de tipul "Person?", care sunt utilizate pentru
a stabili mai multe referint ,e la o nou ˘a instant ,˘a de Person.
Fig. 16: Referint ,e c˘atre clasa Person?
În continuare se atribuie o noua instant ˘a de Person uneia dintre cele trei variabile:
Fig. 17: Atribuirea unei instant ,e a clasei Person
31
VEGHIU Sorin-Andrei
Atribuirea din Fig.17 are ca rezultat afis ,area mesajului "John Appleseed is being initialised".
Deoarece noua instant ,˘a a clasei Person a fost atribuit ˘a variabilei "refference1", exist ˘a o referint ,˘a
puternic ˘a de la "refference1" c ˘atre noua instant ,˘a. Fiindc ˘a exist ˘a doar o referint ,˘a puternic ˘a, ARC se
asigur ˘a de faptul c ˘a aceast ˘a nou ˘a instant ,˘a este p ˘astrat ˘a în memorie s ,i nu este dealocat ˘a.
Fig. 18: Noi referint ,e puternice
Astfel, dac ˘a se atribuie altor dou ˘a variabile aceeas ,i instant ,˘a Person, atunci se vor crea doua noi
referint ,e puternice, precum în Fig.18.
Dac˘a se elimin ˘a primele dou ˘a referint ,e puternice, fiind atribuite cu nil, atunci va r ˘amâne o
singur ˘a referint ,˘a puternic ˘a, deoarece ARC nu dealoc ˘a instant ,a Person pân ˘a când s ,i ultima referint ,˘a
puternic ˘a este eliminat ˘a:
Fig. 19: Eliminarea primelor dou ˘a referint ,e puternice
Dup˘a eliminarea ultimei referint ,e puternice, ARC dealoc ˘a instant ,a clasei Person s ,i se va afis ,a
mesajul "John Appleaseed is being deinitialised".
Fig. 20: Eliminarea ultimei referint ,e puternice
2.2 Framework-ul SpriteKit
SpriteKit este o infrastructur ˘a pentru randarea elementelor grafice s ,i animat ,iilor 2D, care este
utilizat pentru a anima arbitrar imagini texturate, cunoscute s ,i sub denumirea de sprite-uri. Acest
framework ofer ˘a o bucl ˘a de randare tradit ,ional ˘a ce alterneaz ˘a între determinarea cont ,inuturilor s ,i
randarea cadrelor.
Animat ,iile s ,i randarea se desf ˘as,oar˘a în cadrul unui obiect SKView. Acest view este plasat în
interiorul unei ferestre, apoi este randat cont ,inutul s ˘au. Deoarece este un view, cont ,inuturile sale
pot fi combinate al ˘aturi de alte view-uri în ierarhia acestora.
32
VEGHIU Sorin-Andrei
2.2.1 Scene
Din punctul de vedere al arhitecturii aplicat ,iei client pe care am realizat-o în Swift cu ajutorul
acestui framework, cont ,inutul s ˘au este organizat în scene, care sunt reprezentate prin obiecte de tip
SKScene.
O scen ˘a cont ,ine sprite-uri s ,i alte cont ,inuturi ce trebuie randate. De asemenea, o scen ˘a imple-
menteaz ˘a logic ˘a per-cadru s ,i procesarea cont ,inutului. Odat ˘a ce o scen ˘a este prezentat ˘a, animat ,iile
sale s ,i logica per-cadru sunt automat executate.
O scen ˘a este prezentat ˘a de c ˘atre view. Aceast ˘a scen ˘a cont ,ine, de asemenea, propriet ˘at,ile care de-
finesc unde este pozit ,ionat ˘a originea scenei, precum s ,i dimensiunea sa. Dac ˘a scena nu se potrives ,te
cu dimensiunea view-ului, atunci se poate scala scena astfel încat s ˘a se încadreze în view-ul respec-
tiv.
În momentul în care o scen ˘a este init ,ializat ˘a, proprietatea sa "size" este configurat ˘a de c ˘atre
contructorul destinat. Dimensiunea scenei specific ˘a dimensiunea sa vizibil ˘a prin puncte. Nodurile
arborelui scenei pot fi pozit ,ionat ,i în afara scenei, vor fi procesat ,i de c ˘atre scen ˘a, îns ˘a, vor fi ignorat ,i
la randare.
Implicit, originea scenei este situat ˘a în colt ,ul din stânga jos al view-ului, precum în Fig. 21.
As,adar, o scen ˘a poate fi init ,ializat ˘a cu în ˘alt,imea 1024 s ,i cu l ˘at,imea 768, având originea în punctul
(0,0), în colt ,ul stânga jos, s ,i punctul (1024, 768) în colt ,ul dreapta sus al view-ului.
Fig. 21: Originea implicit ˘a a unei scene SKScene
Proprietatea "position" a scenei este ignorat ˘a de c ˘atre Scene Kit, deoarece scena este întotdeauna
33
VEGHIU Sorin-Andrei
r˘ad˘acina arborelui. Îns ˘a, originea scenei poate fi mutat ˘a prin setarea propriet ˘at,ii "anchorPoint".
Punctul de ancorare este specificat în spat ,iul coordonate s ,i alege un punct din view-ul utilizat.
Valoarea implicit ˘a a punctului de ancorare este 0. Îns ˘a, un punct de ancorare des utilizat este
(0.5, 0.5), care centreaz ˘a originea scenei în mijlocul view-ului, precum se poate observa în Fig. 22.
Astfel, spat ,iul de coordonate al scenei devine (-l ˘at,ime/2, -în ˘alt,ime/2) s ,i (l˘at,ime/2, în ˘alt,ime/2).
Fig. 22: Pozit ,ionarea originii scenei în mijlocul view-ului
Dup˘a ce o scen ˘a este randat ˘a, cont ,inuturile sale sunt copiate în view-ul prezentat. Dac ˘a scena are
aceeas ,i dimensiune cu view-ul, atunci cont ,inuturile sale sunt direct copiate în view. Îns ˘a, dac ˘a cele
dou˘a difer ˘a, scena trebuie scalat ˘a pentru a se încadra în view. Proprietatea "scaleMode" determin ˘a
cum este scalat cont ,inutul unei scene. Exist ˘a patru moduri de scalare ale scenei, dup ˘a cum urmeaz ˘a:
fill – Fiecare ax ˘a a scenei este scalat ˘a independent, astfel încât toate axele scenei s ˘a se
potriveasc ˘a exact cu lungimea axei view-ului.
aspectFill – Se calculeaz ˘a factorul de scalare al fiec ˘arei dimensiuni s ,i este aleas ˘a cea mai
mare dintre cele dou ˘a. Fiecare ax ˘a a scenei este scalat ˘a de acelas ,i factor de scalare. Acest
lucru garanteaz ˘a faptul c ˘a întreaga zon ˘a a view-ului este umplut ˘a, dar poate cauza decuparea
anumitor p ˘art,i ale scenei.
aspectFit – Se calculeaz ˘a factorul de scalare al fiec ˘arei dimensiuni s ,i se alege cel mai mic
dintre cele dou ˘a. Fiecare ax ˘a a scenei este scalat ˘a de acelas ,i factor de scalare. Acest lucru
garanteaz ˘a c˘a întreaga scen ˘a este vizibil ˘a, dar poate necesita un format letterbox al view-ului.
34
VEGHIU Sorin-Andrei
resizeFill – Scena nu este scalat ˘a pentru a se potrivi cu view-ul. În schimb, scena este redi-
mensionat ˘a automat, astfel încât dimensiunile acesteia s ˘a se potriveasc ˘a întotdeauna cu cele
ale view-ului.
Dac˘a se dores ,te schimbarea dimensiunii scenei la runetime, atunci trebuie suprascris ˘a metoda
"didChangeSize(_:)" a scenei. Atunci când aceast ˘a metod ˘a este apelat ˘a, trebuie s ˘a actualizeze
cont ,inutul pentru a se potrivi cu noua dimensiune a scenei.
Procesul de randare s ,i animare a scenei este legat de obiectul scen ˘a SKScene. Scena s ,i procesarea
act,iunilor ruleaz ˘a doar atunci când scena este preentat ˘a. O scen ˘a prezentat ˘a ruleaz ˘a o bucl ˘a de
randare ce alterneaz ˘a între procesarea arborelui scenei s ,i randarea sa.
SpriteKit randeaz ˘a scena doar atunci când ceva din interiorul s ˘au a fost schimbat, sporind
eficient ,a energiei s ,i oferind posibilitatea jocului s ˘a execute alte operat ,ii în fundal. În Fig. 23 se
pot observa pas ,ii prin care o scen ˘a execut ˘a bucla de randare:
Fig. 23: Pas ,ii de randare ai scenei
De fiecare dat ˘a, în cadrul buclei de randare, cont ,inuturile scenei sunt actualizate s ,i randate. Nu
se poate suprascrie comportamentul rand ˘arii, dar se pot actualiza nodurile scenei. Totodat ˘a, scena
cont ,ine metode care pot fi suprascrise pentru a personaliza procesarea scenei s ,i pentru a utiliza
act,iuni s ,i propriet ˘at,i fizice care modific ˘a propriet ˘at,ile nodurilor arborelui. Pas ,ii buclei de randare
sunt urm ˘atorii:
Metoda "update(_:)" a scenei este apelat ˘a odat ˘a cu timpul scurs pân ˘a în prezent în cadrul
simul ˘arii. Aici este locul pentru implementarea logicii jocului, precum utilizarea datelor de
intrare, inteligent ,˘a artificial ˘a, script-uri de joc s ,i alte elemente de logic ˘a în cadrul jocului.
Adesea, aceast ˘a metod ˘a se foloses ,te pentru a face schimb ˘ari sau a porni act ,iuni în cadrul
anumitor noduri.
35
VEGHIU Sorin-Andrei
Scena proceseaz ˘a act ,iunile tuturor nodurilor din arbore. Aceasta g ˘ases ,te toate act ,iunile care
ruleaz ˘a s,i aplic ˘a modific ˘arile arborelui. Practic, datorit ˘a act ,iunilor personalizate, se poate
influent ,a mecanismul act ,iunilor prin apelarea propriului cod. Nu se poate controla ordinea în
care act ,iunile sunt procesate sau determina ca scena s ˘a ignore act ,iunile anumitor noduri, cu
except ,ia elimin ˘arii act ,iunilor din acele noduri sau elimin ˘arii nodurilor din arbore.
Metoda "didEvaluateActions()" a scenei este apelat ˘a dup ˘a ce toate act ,iunile cadrului au fost
procesate.
Scena simuleaz ˘a fizica nodurilor din arbore care cont ,in corpuri fizice. Ad ˘augarea fizicii
nodurilor într-o scen ˘a este descris ˘a în claa SKPhysicsBody, dar rezultatul simul ˘arii fizicii
este faptul c ˘a pozit ,ia s,i rotat ,ia nodurilor din arbore pot fi ajustate de c ˘atre aceasta.
Metoda "didSimulatePhysics()" a scenei este apelat ˘a dup ˘a ce toate elementele fizice din cadru
au fost simulate.
Scena aplic ˘a orice constrângeri asociate cu nodurile din scen ˘a. Constrângerile sunt folosite
pentru a stabili relat ,iile din scen ˘a. De exemplu, se poate aplica o constrângere care asigur ˘a
faptul c ˘a un nod este întotdeauna îndreptat c ˘atre un alt nod, indiferent de modul în care este
mutat. Prin utilizarea constrângerilor, se evit ˘a scrierea unei mari part ,i de cod personalizat
pentru gestionarea scenelor.
Scena îs ,i apeleaz ˘a metoda "didApplyConstraints()".
Scena îs ,i apeleaz ˘a metoda "didFinishUpdate()".
Scena este randat ˘a.
Pentru crearea jocului, folosind SpriteKit, se poate extinde clasa SKScene sau se pot crea
delegat ,i ai scenelor (cunoscut ,i s,i sub denumirea de protocoale – Fig. 24) pentru a asigura în-
deplinirea tuturor sarcinilor necesare jocului. Pentru a efectua animat ,iile tranzit ,iilor între scenele
jocului se poate folosi clasa SKTransition.
Fig. 24: Delegatul scenelor de joc
Clasa SKScene este descendent ˘a a clasei SKNode. În cadrul utiliz ˘arii SpriteKit, nodurile reprez-
int˘a construct ,iile fundamentale pentru tot cont ,inutul, având obiectul scen ˘a ca s ,i nod r ˘ad˘acin˘a pentru
36
VEGHIU Sorin-Andrei
restul nodurilor. Scena împreun ˘a cu descendent ,ii s˘ai determin ˘a ce cont ,inut este desenat s ,i cum este
randat.
Pozit ,ia fiec ˘arui nod este specificat ˘a în funct ,ie de sistemul de coordonate al parintelui s ˘au. De
asemenea, un nod aplic ˘a s,i alte propriet ˘at,i cont ,inutului s ˘au s ,i al descendent ,ilor s ˘ai. Spre exemplu,
dac˘a un nod este rotit, atunci s ,i descendent ,ii s˘ai sunt rotit ,i.
Clasa SKNode nu poate desena nimic, îns ˘a, poate aplica propriet ˘at,i descendent ,ilor s ˘ai. Fiecare
tip de cont ,inut desenabil este reprezentat de o subclas ˘a distinct ˘a în SpriteKit. Exist ˘a s,i alte sub-
clase care nu pot desena propriul cont ,inut, dar pot modifica comportamentul descendent ,ilor s ˘ai. De
exemplu, se poate folosi un obiect SKEffectNode pentru a aplica un filtru Core Image pentru un
întreg subarbore al scenei. Prin controlul asupra structurii arborelui de noduri, se poate determina
ordinea în care fiecare nod este randat.
Toate obiectele nod sunt s ,i obiecte responder, fiind descendent ,i ai claselor UIResponder sau
NSResponder, deci orice clas ˘a nod poate fi subclasat ˘a s,i poate crea noi clase care accept ˘a date
introduse de utilizator.
2.2.2 Texturi
Texturile, reprezentate prin obiecte SKTexture, sunt imagini utilizate pentru randarea sprite-
urilor. Întotdeauna texturile se folosesc atunci când este necesar ˘a aplicarea aceleias ,i imagini pentru
diferite sprite-uri. Cu toate acestea, SpriteKit poate, de asemenea, s ˘a creeze texturi ce provin din
alte la runetime, incluzând imagini din Core Graphics sau chiar prin randarea unui arbore într-o
textur ˘a.
SpriteKit simplific ˘a gestionarea texturilor prin utilizarea codului de nivel sc ˘azut necesar pentru
înc˘arcarea texturilor s ,i prin a le face disponibile pentru hardware-ul grafic. Texturile sunt automat
gestionate de c ˘atre SpirteKit. Totus ,i, în cazul unui num ˘ar mare de imagini se poate îmbun ˘at˘at,ii
performant ,a prin preluarea controlului asupra anumitor p ˘art,i din proces.
Un atlas de texturi este un grup de texturi care pot fi folosite împreun ˘a în cadrul jocului. Spre
exemplu, un atlas de texturi poate fi folosit pentru a stoca toate texturile necesare pentu a anima
un personaj sau toate detaliile pentru randarea unui fundal al unui nivel de joc. SpriteKit utilizeaz ˘a
atlasele de texturi pentru îmbun ˘at˘at,irea peformant ,ei rand ˘arii.
Fig. 25: Utilizarea unui atlas de texturi
37
VEGHIU Sorin-Andrei
2.2.3 Act ,iuni
Cont ,inutul unei scene este animat prin utilizarea act ,iunilor. Orice act ,iune este un obiect, definit
de c˘atre clasa SKAction. Atunci când scena proceseaz ˘a cadrele animat ,iilor, act ,iunile sunt execu-
tate. Unele act ,iuni pot fi executate complet într-un singur cadru de animat ,ie, în timp ce alte act ,iuni
aplic ˘a modific ˘ari pe parcursul a mai multor cadre pân ˘a când sunt executate complet. Cele mai des
folosite act ,iuni sunt cele pentru animarea schimb ˘arilor propriet ˘at,ilor unui nod. Spre exemplu, se
poate crea o act ,iune care mis ,c˘a nodul, îl scaleaz ˘a, îl rotes ,te sau îl face transparent. Cu toate acestea,
act,iunile pot schimba arborele, pot utiliza sunete sau pot executa un cod personalizat.
Act ,iunile sunt folositoare, îns ˘a se pot s ,i combina, de asemenea, pentru a crea efecte mult mai
complexe. Totodat ˘a, se pot crea grupuri de act ,iuni ce pot rula simultan sau pe anumite secvent ,e.
Atunci când o scen ˘a proceseaz ˘a nodurile, act ,iunile asociate acelor noduri sunt evaluate. Pentru
a crea o act ,iune, se apeleaz ˘a metoda corespunz ˘atoare pentru act ,iunea dorit ˘a. Apoi se configureaz ˘a
propriet ˘at,ile act ,iunii, iar în final, se execut ˘a act ,iunea prin apelul metodei "run(_:)" a nodului.
Fig. 26: Exemplu de act ,iune ce mut ˘a un nod
Majoritatea act ,iunilor permit schimbarea propriet ˘at,ilor nodurilor, precum pozit ,ia, rotat ,ia sau
scalarea. Unele act ,iuni sunt aplicate doar obiectelor de tip SKSpriteNode, oferind permisiunea de
a modifica culoarea sprite-ului sau propriet ˘at,ile texturilor. Multe dintre aceste act ,iuni sunt animate
de c˘atre framework-ul SpriteKit, astfel încât schimb ˘a propriet ˘at,ile nodului asociat în mai mult de
un cadru de animat ,ie randat de c ˘atre scen ˘a. Atunci când o act ,iune este animat ˘a, proprietatea "dura-
tion" declar ˘a cat timp dureaz ˘a act ,iunea respectiv ˘a, în secunde, pentru a fi completat ˘a s,i proprietatea
"timingMode" defines ,te cat de des este executat ˘a animat ,ia. Proprietatea "speed" a act ,iunii permite
ajustarea sincroniz ˘arii animat ,iei prin cres ,terea sau descres ,terea vitezei de playback.
Multe act ,iuni pot fi reversate, permit ,ând crearea unui alt obiect act ,iune care reverseaz ˘a efectul
act,iunii init ,iale. De exemplu, dac ˘a un obiect act ,iune mut ˘a un nod 20 de puncte spre dreapta fat ,˘a de
pozit ,ia sa curent ˘a, act ,iunea reversat ˘a va muta nodul cu 20 de puncte în partea din stânga. Pentru a
crea un obiect reversat se apeleaz ˘a metoda "reversed()" a obiectului act ,iune.
Unele act ,iuni cont ,in s ,i alte act ,iuni copii:
O secvent ,˘a de act ,iuni cont ,ine multiple act ,iuni copil. Fiecare act ,iune din secvent ,˘a începe
dup˘a ce act ,iunea anterioar ˘a se sfârs ,es,te.
Un grup de act ,iuni cont ,ine multiple act ,iuni copil. Toate act ,iunile sunt stocate în grup se
execut ˘a simultan.
38
VEGHIU Sorin-Andrei
O act ,iune repetitiv ˘a cont ,ine o singur ˘a act ,iune copil. Atunci când act ,iunea copil este complet ˘a,
este resetat ˘a.
Fig. 27: Exemplu de secvent ,˘a de act ,iuni
În exemplul din Fig. 27 exist ˘a câteva am ˘anunte notabile:
Act ,iunea "wait" este o act ,iune special ˘a, care este folosit ˘a de obicei în secvent ,e. Aceast ˘a
act,iune doar as ,teapt ˘a o perioad ˘a de timp dup ˘a care continu ˘a parcurgerea secvent ,ei.
Act ,iunea "removeNode" este o act ,iune instantanee, care elimin ˘a nodul din arbore s ,i încheie
execut ,ia secvent ,ei.
Fig. 28: Ordinea execut ,iei secvent ,ei act ,iunilor
Pentru a verifica dac ˘a un nod cont ,ine act ,iuni, se apeleaz ˘a metoda sa "hasActions()", care va
returna "true" în cazul în care nodul are act ,iuni asociate.
Pentru a anula act ,iunile unui nod, se apeleaz ˘a metoda sa "removeAllActions()". Astfel, toate
act,iunile vor fi eliminate, iar nodul va r ˘amâne cu modific ˘arile efectuate de c ˘atre act ,iuni.
Metoda "run(_:completion:)" este similar ˘a cu metoda "run(_:)", îns ˘a dup ˘a ce act ,iunea init ,ial˘a
apelat ˘a de metod ˘a este complet ˘a, se apeleaz ˘a codul din "completion". Acest apel este posibil
39
VEGHIU Sorin-Andrei
doar în cazul în care act ,iunea init ,ial˘a este completat ˘a cu succes. Urm ˘atoarea secvent ,˘a de cod face
ca un nod sprite s ˘a dispar ˘a folosind act ,iunea "fadeOut(withDuration:)", iar dup ˘a ce act ,iunea este
complet ˘a se prezint ˘a o nou ˘a scen ˘a:
Fig. 29: Apelul metodei "run(_:completion:)"
2.2.4 SKPhysics
Des ,i se poate seta pozit ,ia exact ˘a pentru fiecare nod din scen ˘a, se pot crea s ,i interact ,iuni între
acestea. Totodat ˘a, exist ˘a fenomene ce nu pot fi satisf ˘acute de c ˘atre sistemul de act ,iuni, precum
simularea gravit ˘at,ii s,i a altor fort ,e. Pentru acest lucru, se pot crea corpuri fizice (SKPhysicsBody)
care se atas ,eaz˘a nodurilor scenei. Fiecare corp fizic este definit de form ˘a, dimensiune, greutate s ,i
alte caracteristici fizice. O scen ˘a defines ,te anumite caracteristici globale pentru simularea fizicii
printr-un obiect SKPhysicsWorld asociat.
Atunci când corpurile fizice sunt incluse într-o scen ˘a, aceasta simuleaz ˘a interact ,iunile fizice
dintre acestea. Unele fort ,e, precum frecarea s ,i gravitat ,ia, sunt aplicate automat. Alte fort ,e pot fi
aplicate asupra corpurilor fizice prin ad ˘augarea în scen ˘a a obiectelor de tip "SKFieldNode". De
asemenea, se poate afecta un corp field prin modificarea direct ˘a a vitezei sale sau prin aplicarea
fort ,elor sau a impulsurilor.
SpriteKit ofer ˘a suport pentru dou ˘a tipuri de corpuri fizice: corpuri bazate pe volum s ,i corpuri
bazate pe margini. Atunci când este creat un corp fizic, tipul, m ˘arimea s ,i forma sa sunt determi-
nate de constructorul care este apelat. Un corp bazat pe margini nu are mas ˘a sau volum s ,i nu este
afectat de fort ,ele sau impulsurile din sistem. Acestea sunt folosite pentru reprezentarea formelor
f˘ar˘a volum sau a spat ,iilor goale din simularea fizic ˘a. Spre deosebire de acestea, corpurile bazate pe
volum sunt folosite pentru reprezentarea obiectelor ce au o anumit ˘a greutate. Proprietatea "isDy-
namic" influent ,eaz˘a dac ˘a un corp bazat pe volum este afectat de c ˘atre gravitat ,ie, frecare, coliziuni
sau alte obiecte, s ,i dac ˘a fort ,ele s ,i impulsurile se aplic ˘a direct pe obiect.
Clasa SKPhysicsBody defines ,te caracteristicile fizice ale unui corp, atunci când acesta este sim-
ulat într-o scen ˘a. Cea mai important ˘a proprietate a corpurilor bazate pe volum este "mass". To-
todat ˘a, un astfel de corp trebuie s ˘a aib ˘a o densitate uniform ˘a s,i de aceea, în locul set ˘arii directe a
propriet ˘at,ii "mass", se poate seta o alt ˘a proprietate numit ˘a "density" prin care corpul fizic îs ,i poate
calcula singur greutatea. Toate valorile în SpriteKit sunt specificate utilizând Sistemul Internat ,ional
de Unit ˘at,i (SI units).
Un obiect SKPhysicsBody defines ,te forma s ,i parametrii simul ˘arii pentru un corp fizic din sistem.
Atunci când o scen ˘a simuleaz ˘a fizica, efectueaz ˘a calculele pentru toate corpurile fizice care sunt
40
VEGHIU Sorin-Andrei
legate de arborele scenei. Astfel, pentru simularea fizicii, un obiect SKPhysicsBody trebuie atas ,at
propriet ˘at,ii "physicsBody" a unui nod. Mai general, exist ˘a urm ˘atoarele tipuri de corpuri fizice
definite în SpriteKit:
Un "volum dinamic" simuleaz ˘a un obiect fizic cu o greutate ce poate fi afectat ˘a de c ˘atre fort ,e
s,i coliziunile din sistem. Astfel de corpuri sunt folosite atunci când se dores ,te ca anumite
obiecte din scen ˘a s˘a se poat ˘a mis ,ca s ,i sa se poat ˘a ciocni între ele.
Un "volum static" este similar cu un volum dinamic, îns ˘a viteza este ignorat ˘a s,i nu poate
fi afectat de c ˘atre fort ,e sau coliziuni. Cu toate acestea, fiindc ˘a are o greutate, alte obiecte
pot ricos ,a din ele sau pot interact ,iona cu acestea. Corpurile cu volum static sunt folosite
pentru reprezentarea obiectelor folosite în cadrul scenei, dar care nu trebuie mis ,cate în cadrul
simul ˘arii. De exemplu, volumele statice pot fi folosite pentru reprezentarea unui drum sau
unor peret ,i ai unui labirint. Practic, des ,i entit ˘at,ile de volume statice s ,i dinamice sunt distincte,
acestea reprezint ˘a dou ˘a moduri ce pot fi aplicate unui corp bazat pe volum.
O "margine" este un corp static f ˘ar˘a volum. Marginile nu sunt niciodat ˘a mis ,cate în cadrul
simul ˘arii, iar greutatea lor nu conteaz ˘a. Spre exemplu, marginile sunt frecvent utilizate pentru
a reprezenta limitele scenei. Principala diferent ,˘a dintre un obiect margine s ,i un obiect volum
este c ˘a o margine permite mis ,carea în interiorul propriilor limite, în timp ce un volum este
considerat un obiect solid. În cazul în care un obiect margine este deplasat prin alte mijloace,
acestea interact ,ioneaz ˘a numai cu volume, nu cu alte margini.
SpriteKit ofer ˘a câteva forme standard, forme bazate pe c ˘ai relative s ,i forme generate din canalul
alfa al unei texturi. Urm ˘atorul exemplu arat ˘a patru tipuri de forme fizice aplicate unui obiect:
Fig. 30: Forme aplicate unui corp fizic
Forma unui corp fizic afecteaz ˘a performant ,a. Un corp fizic circular ofer ˘a cea mai bun ˘a performant ,˘a
s,i poate fi mai rapid decât alte corpuri fizice. Formele dreptunghiulare sau poligonale îmbun ˘at˘at,esc
precizia coliziunilor, îns ˘a cu o vitez ˘a redus ˘a. Corpurile fizice create utilizând canalul alfa al unei
texturi ofer ˘a cea mai bun ˘a fidelitate în detrimentul celui mai ridicat cost computat ,ional. În Fig. 31
se poate observa codul prin care corpurile fizice din figura anterioar ˘a au fost generate:
41
VEGHIU Sorin-Andrei
Fig. 31: Codul formelor corpurilor fizice
Fiecare corp fizic cont ,ine valori ale propriet ˘at,ilor sale care determin ˘a exact cum react ,ioneaz ˘a
corpul asupra fort ,elor s ,i coliziunilor din scen ˘a. Cele mai importante propriet ˘at,i ale corpurilor fizice
sunt:
Proprietatea "mass" determin ˘a cum este corpul afectat de c ˘atre fort ,e, precum s ,i cât de mult ˘a
inert ,ie are corpul atunci când este implicat într-o coliziune.
Proprietatea "friction" determin ˘a cât de aspr ˘a este suprafat ,a corpului. Totodat ˘a este folosit ˘a
pentru a calcula fort ,a de frecare pe care corpul respectiv o aplic ˘a altor corpuri atunci când se
mis ,c˘a pe suprafat ,a sa.
Propriet ˘at,ile "linearDamping" s ,i "angularDamping" sunt utilizate pentru a calcula fort ,a de
frecare pe care corpul o are atunci când se mis ,c˘a în aplicat ,ie. Spre exemplu, se poate simula
fort ,a de frecare dintre aer s ,i ap˘a.
Proprietatea "restitution" determin ˘a cat din energia corpului se ment ,ine în cazul unei coliziuni
(felul în care ricos ,eaz˘a).
Alte propriet ˘at,i sunt utilizate pentru a determina cum este executat ˘a simularea pe corpul respec-
tiv:
Proprietatea "isDynamic" determin ˘a dac ˘a acel corp simuleaz ˘a subsistemul fizic.
Proprietatea "affectedByGravity" determin ˘a dac ˘a simularea impune o fort ,˘a gravitat ,ional ˘a
asupra corpului.
Proprietatea "allowsRotation" determin ˘a dac ˘a fort ,ele pot aplica viteza de rotat ,ie asupra cor-
pului.
42
VEGHIU Sorin-Andrei
În cadrul exemplului urm ˘ator (Fig. 32) se pot observa corpurile fizice în cadrul aplicat ,iei client
al lucr ˘arii de licent ,˘a:
Fig. 32: Corpurile fizice din aplicat ,ia client a lucr ˘arii de licent ,˘a
Jocul cont ,ine dou ˘a tipuri de corpuri fizice: eroul s ,i cutiile. Init ,ial, niciuna dintre aceste corpuri
nu are aplicat ˘a fort ,a gravitat ,ional ˘a, îns ˘a, dac ˘a acestea interact ,ioneaz ˘a atunci se aplic ˘a un impuls s ,i o
fort ,a gravitat ,ional ˘a asupra eroului astfel încat acesta pic ˘a, ies ,ind din cadrul scenei. Totodat ˘a, cutiile
ricos ,eaz˘a atunci când interact ,ioneaz ˘a cu eroul din joc, acesta fiind un tip de ricos ,are implicit.
2.2.4.1 Coliziuni s ,i contacte
SpriteKit ofer ˘a doua tipuri de interact ,iuni între corpurile fizice:
Un contact este utilizat atunci când este nevoie s ˘a se s ,tie dac ˘a dou ˘a corpuri se ating. În ma-
joritatea cazurilor, contactele se utilizeaz ˘a atunci când apare o coliziune s ,i trebuie efectuate
anumite schimb ˘ari în cadrul jocului.
O coliziune este utilizat ˘a pentru a preveni ca dou ˘a obiecte s ˘a intre una în spat ,iul celeilalte.
Atunci când un corp se ciocnes ,te de un alt corp, SpriteKit calculeaz ˘a automat rezultatele
coliziunii s ,i aplic ˘a un impuls corpurilor din cadrul coliziunii.
Jocul configureaz ˘a corpurile fizice din scen ˘a pentru a determina atunci când trebuie s ˘a aib ˘a loc
coliziunile sau când interact ,iunile dintre acestea necesit ˘a logic ˘a de joc adit ,ional ˘a pentru a fi execu-
tate. Limitarea acestor interact ,iuni nu este doar important ˘a pentru definirea logicii jocului, ci s ,i este,
de asemenea, necesar ˘a pentru a obt ,ine o performant ,˘a bun ˘a a framework-ului SpriteKit. Framework-
ul utilizeaz ˘a dou ˘a tipuri de mecanisme pentru a limita num ˘arul de interact ,iuni din fiecare cadru:
Corpurile fizice bazate pe margini nu interact ,ioneaz ˘a niciodat ˘a cu alte astfel de corpuri fizice.
Acest lucru înseamn ˘a, cu alte cuvinte, c ˘a s,i dac ˘a se mut ˘a corpurile bazate pe margini prin
repozit ,ionarea nodurilor, corpurile fizice nu vor avea niciodat ˘a contact sau coliziuni.
43
VEGHIU Sorin-Andrei
Orice corp fizic este categorizat. Categoriile sunt definite de c ˘atre aplicat ,ie, iar fiecare scen ˘a
poate avea maxim 32 de categorii. Atunci când un corp fizic este configurat, trebuie definit ˘a
categoria de care apart ,ine s ,i categoriile corpurilor cu care dores ,te s˘a interact ,ioneze. Con-
tactele s ,i coliziunile sunt independente.
În urm ˘atoarea secvent ,˘a de cod se atribuie propriet ˘at,ii "physicsBody" a clasei HeroPlayer, din
cadrul proiectului de licent ,˘a, un corp fizic dreptunghiular cu în ˘alt,imea 40 s ,i l˘at,imea 30. Totodat ˘a,
sunt atribuite s ,i valorile categoriilor care îi apart ,in:
Fig. 33: Atribuirea categoriilor corpului fizic al clasei HeroPlayer
"categoryBitMask" reprezint ˘a categoria corpului fizic al eroului
"contactTestBitMask" reprezint ˘a categoria corpului fizic cu care eroul poate intra în contact,
s,i anume, categoria cutiilor
"collisionBitMask" reprezint ˘a categoria corpului fizic cu care eroul poate intra într-o coliz-
iune
"affectedByGravity" determin ˘a dac ˘a eroul este sau nu afectat de c ˘atre fort ,a gravitat ,ional ˘a
De asemenea, categoriile corpului fizic al clasei Box, sunt similare, aceasta având în ˘alt,imea s ,i
l˘at,imea egale cu 50.
Fig. 34: Atribuirea categoriilor corpului fizic al clasei Box
Ambele valori ale categoriilor ment ,ionate se pot observa în enum-ul BodyType al proiectului:
Fig. 35: Enum-ul BodyType
44
VEGHIU Sorin-Andrei
3 Limbajul Java s ,i arhitectura serverului
3.1 Framework-ul Grizzly pentru serverul HTTP
Project Grizzly este un serviciu web Java, construit cu ajutorul API-ului NIO. Principalul mo-
tiv al utiliz ˘arii framework-ului Grizzly este pentru componenta serverului web a aplicat ,iei server
GlassFish.
Framework-ul Grizzly pentru serverul HTTP construies ,te cadrul HTTP necesar pentru simplifi-
carea operat ,iilor de zi cu zi ale unui server web. Acest framework include urm ˘atoarele funct ,ionalit ˘at,i:
Un API pentru server pentru integrarea us ,oar˘a a framework-ului în aplicat ,ie.
Abstract ,ii similare precum cele oferite de c ˘atre specificat ,iile Servlet-urilor: HttpHandler
(Servlet), Request (HttpServletRequest), Response (HttpServletResponse).
Capacitatea de a gestiona tranzact ,ii HTTP de lung ˘a durat ˘a prin facilit ˘at,ile de r ˘aspuns suspend
s,i resume.
Suportul pentru stream-urile IO non-blocking (inbound s ,i outbound).
Un fis ,ier cache pentru cont ,inutul static.
Component ˘a Descriere
HttpServer Acesta este serverul Grizzly HTTP care poate fi utilizat cu scopul de a
crea programe HTTP standalone sau pentru a încorpora Grizzly în alte
aplicat ,ii ce folosesc servicii HTTP.
ServerConfiguration Aceast ˘a clas ˘a permite programatorilor s ˘a adauge serverului implemen-
t˘ari HttpHandler personalizate, precum s ,i furnizarea funct ,iilor ce uti-
lizeaz ˘a JMX sau monitorizarea.
NetworkListener Aceasta este o abstract ,ie a implement ˘ariilor NIOTrasport s ,i Filter din
Grizzly. De asemenea, permite activarea s ,i dezactivarea funct ,iilor
legate de HTTP precum keep-alive, chunked transfer-encoding, addon-
uri personalizate, etc. HttpServer ofer ˘a suport pentru multipli
NetworkListener-i. Totodat ˘a, tot ,i HttpHandler-i vor fi ad ˘augat ,i în
ServerConfiguration s ,i vor fi partajat ,i pentru tot ,i ascult ˘atorii (din eng.
listener).
HttpHandler HttpHandler este înrudit cu javax.servlet.Servlet.
Request Un request este similar cu javax.servlet.httpServletRequest.
Response Un response este similar cu javax.servlet.http.HttpServletResponse.
Session O sesiune este similar ˘a cu javax.servlet.http.HttpSession.
HttpServerFilter Aceast ˘a implementare de Filter ofer ˘a un nivel ridicat HTTP de proce-
sare a request-urilor s ,i a response-urilor. Totodat ˘a, acesta este ad ˘augat
la FilterChain care este utilizat de c ˘atre NetworkListener.
45
VEGHIU Sorin-Andrei
FileCacheFilter Acest filtru ofer ˘a capabilit ˘at,i statice de cache a resurselor. Precum s ,i
HttpServerFilter, dac ˘a este activat cache-ul fis ,ierelor, acest filtru va fi
ad˘augat automat.
AddOn Interfat ,a general ˘a pentru addon-urile HttpServer, care presupune extin-
derea funct ,ionalit ˘at,ii HttpServer de baz ˘a.
Propriet ˘at,ile ServerConfiguration
Proprietate Descriere
name Seteaz ˘a numele instant ,ei serverului HTTP. Dac ˘a nu este definit niciun
nume, atunci i se va atribui unul.
jmxEnabled Determin ˘a dac ˘a monitorizarea JMX va fi sau nu activat ˘a pentru instant ,a
serverului Http.
version Seteaz ˘a versiunea instant ,ei serverului. Dac ˘a nu este setat ˘a explicit,
atunci versiunea va fi "@VERSION@".
Propriet ˘at,ile NetworkListener
Proprietate Descriere
name Numele logic al ascult ˘atorului (listener), care este setat doar de c ˘atre
constructor.
host Gazda ret ,elei de care se va lega acest ascult ˘ator (din eng. listener). Dac ˘a
nu este specificat de c ˘atre utilizator, atunci va fi implicit 0.0.0.0 (poate
fi setat doar de c ˘atre constructor).
port Portul ret ,elei de care se va lega acest listener. Dac ˘a nu este specificat,
atunci va fi implicit portul 8080 (poate fi setat doar de c ˘atre constructor).
portRange S,irul de porturi pentru care se încearc ˘a legarea severului. Va fi utilizat
primul port de care se poate lega.
keepAlive Returneaz ˘a configurat ,ia keep-alive pentru acest ascult ˘ator. Aceasta per-
mite configurarea timeout-ului conexiunii inactive (implicit de 30 de
secunde) s ,i configurat ,ia de solicit ˘ari maxime (implicit de 256).
transport Aceast ˘a proprietate se utilizeaz ˘a pentru reglarea fin ˘a a configurat ,iei de
transport. Cu toate acestea, exist ˘a s,i transporturi personalizate.
addons Setul addon-urilor, care presupun extinderea funct ,ionalit ˘at,ii de baz ˘a a
serverului HTTP.
chunkingEnabled Activeaz ˘a sau dezactiveaz ˘a transferul codat al datelor (implicit este ac-
tivat).
secure Activeaz ˘a sau dezactiveaz ˘a suportul pentru SSL/TLS (implicit este
dezactivat).
sslEngineConfig Dac˘a SSL/TLS este activat, atunci programatorul trebuie s ˘a specifice
un SSLEngineConfigurator. Acest ˘a proprietate controleaz ˘a modul cum
este creat SSLEngine.
46
VEGHIU Sorin-Andrei
maxHttpHeaderSize Specific ˘a, în bit ,i, m˘arimea maxim ˘a a header-ului mesajului http pentru a
nu fi respins. Aceast ˘a configurat ,ie este aplicabil ˘a doar pentru solicit ˘arile
primite.
filterChain Permite personalizarea FilterChain-ului utilizat de c ˘atre aceast ˘a instant ,˘a
a ascult ˘atorului.
fileCache Permite personalizarea conigur ˘arii FileCache utilizat de c ˘atre aceast ˘a
instant ,˘a a ascult ˘atorului.
contentEncodings Codific ˘arile cont ,inutului (de exemplu gzip) care pot fi aplicate pentru
tranzact ,iile HTTP pentru acest ascult ˘ator. Se pot furniza codific ˘ari per-
sonalizate.
maxPendingBytes Specific ˘a num ˘arul maxim de octet ,i care pot fi în as ,teptare pentru
scrierea unei anumite conexiuni. Dac ˘a octet ,ii nu sunt consumat ,i s,i
aceast ˘a valoare este dep ˘as,it˘a, conexiunea va fi închis ˘a.
maxRequestHeaders Num ˘arul maxim de headere permise pentru o anumit ˘a solicitare. Dac ˘a
valoarea este dep ˘as,it˘a, solicitarea va fi respins ˘a.
maxResponseHeaders Num ˘arul maxim de headere pe care un r ˘aspuns (din eng. response) îl
poate trimite unui client. Dac ˘a valoarea este dep ˘as,it˘a, atunci o eroare
va fi trimis ˘a c˘atre client.
3.2 Serviciile web RESTful (Representational State Transfer)
Representational State Transfer (REST) sau serviciile web RESTful reprezint ˘a un stil arhitec-
tural bazat pe standarde web s ,i pe protocolul HTTP. REST a fost definit pentru prima dat ˘a de c ˘atre
Roy Fielding în anul 2000 în lucrarea sa de doctorat. În arhitectura bazat ˘a pe REST totul reprez-
int˘a o resurs ˘a. O resurs ˘a este accesat ˘a printr-o interfat ,˘a comun ˘a bazat ˘a pe metodele standard HTTP.
Serviciile web compatibile cu REST, permit sistemelor solicitante s ˘a acceseze s ,i s˘a modeleze
reprezent ˘arile textuale ale resurselor web folosind un set uniform s ,i predefinit de operat ,ii f˘ar˘a stare.
Resursele web au fost definite pentru prima oar ˘a de c ˘atre World Wide Web ca fiind documente sau
fis,iere indentificare prin adresele lor URL (Uniform Resource Locator), îns ˘a în ziua de azi exist ˘a
o definit ,ie mult mai abstract ˘a s,i mai generic ˘a, ce cuprinde toate entit ˘at,ile care pot fi indentificate,
numite, adresate sau modificate pe web.
Un serviciu web RESTful se bazeaz ˘a pe metodele standard HTTP s ,i pe conceptele REST. Acesta
defines ,te un URI (Uniform Resource Identifier) de baz ˘a, suportul pentru tipurile MIME (precum
XML, txt, JSON, etc.) s ,i un set de operat ,ii HTTP.
Operat ,iile HTTP utiliate de c ˘atre serviciile RESTful sunt:
GET – utilizat ˘a atunci când este necesitat ˘a o resurs ˘a din cadrul serverului
POST – utilizat ˘a pentru trimiterea datelor c ˘atre server
PUT – utilizat ˘a pentru a pune documente pe server
DELETE – s ,terge o resurs ˘a de pe server
47
VEGHIU Sorin-Andrei
Astfel, folosind un protocol f ˘ar˘a stare s ,i operat ,iuni standard, sistemele REST vizeaz ˘a performant ,a
rapid ˘a, fiabilitatea s ,i capacitatea de cres ,tere, prin reutilizarea componentelor care pot fi organizate
s,i actualizate f ˘ar˘a a afecta întregul sistem, chiar s ,i atunci când acesta ruleaz ˘a.
Propriet ˘at,i arhitecturale
Interact ,iunile de performant ,˘a – componente pot fi factorul dominant în performant ,a perceput ˘a
de utilizator s ,i eficient ,a ret ,elei
Scalabilitate – pentru a suporta un num ˘ar mare de componente s ,i interact ,iuni între compo-
nente
Simplitatea – unei interfet ,e uniforme
Modificabilitatea componentelor – pentru a satisface nevoile pentru a face schimb ˘ari (chiar s ,i
în timp ce aplicat ,ia ruleaz ˘a)
Vizibilitatea comunic ˘arii – între componente prin intermediul agent ,ilor de servicii
Portabilitatea componentelor – prin mutarea codului de program cu datele
Fiabilitatea – reprezint ˘a rezistent ,a la defect ,iuni la nivelul sistemului, în cazul unor defect ,iuni
ale componentelor, conectorilor sau datelor
48
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Lucrare de Licent ,a [630822] (ID: 630822)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
